C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: RichTextBoxの行間を詰める方法


(過去ログ 21 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■8671 / inTopicNo.1)  RichTextBoxの行間を詰める方法
  
□投稿者/ tk (13回)-(2007/10/05(Fri) 19:42:41)

分類:[.NET 全般] 

いつもお世話になっております。

調べに調べたのですが、ここを最終手段として質問させてください。

表題の通り、RichTextBoxの行間を詰める方法ですが、
どうやらPARAFORMAT2構造体をSendMessageするというのが妥当みたいです。
ただこれを実現しているサンプルがなかったので、この方法自体有用なのかは
わかりません。

とりあえずコードを既述します。

まず、DLLに送るための構造体としてこのように宣言します。
[StructLayout(LayoutKind.Sequential)]
public struct PARAFORMAT2 {
public uint cbSize;
public uint dwMask;
public ushort wNumbering;
public ushort wEffects;
public int dxStartIndent;
public int dxRightIndent;
public int dxOffset;
public ushort wAlignment;
public short cTabCount;
[MarshalAs(UnmanagedType.I4, SizeConst = 32)] //←ここの書き方怪しい・・・
public int rgxTabs;
public int dySpaceBefore;
public int dySpaceAfter;
public int dyLineSpacing;
public short sStyle;
public byte bLineSpacingRule;
public byte bOutlineLevel;
public ushort wShadingWeight;
public ushort wShadingStyle;
public ushort wNumberingStart;
public ushort wNumberingStyle;
public ushort wNumberingTab;
public ushort wBorderSpace;
public ushort wBorderWidth;
public ushort wBorders;
}

そしてRichTextBoxがnewされた後くらいに
const int EM_SETPARAFORMAT = 0x0447;
const uint PFM_LINESPACING = 0x00000100;

//DLLのメモリ確保して
IntPtr p = Marshal.AllocCoTaskMem(Marshal.SizeOf(new ChildRichEdit.PARAFORMAT2()));
//設定必要だからマネージに戻して
ChildRichEdit.PARAFORMAT2 cf = (ChildRichEdit.PARAFORMAT2)Marshal.PtrToStructure(p, typeof(ChildRichEdit.PARAFORMAT2));
//適当な値をセットして
cf.cbSize = (uint)Marshal.SizeOf(new ChildRichEdit.CHARFORMAT());
cf.dwMask |= PFM_LINESPACING;
cf.bLineSpacingRule = 4;
cf.dyLineSpacing = 40;
//アンマネージに戻して
Marshal.StructureToPtr(cf, p, true);

//SendとFree
int ret = SendMessage(this.richTextBox1.Handle, EM_SETPARAFORMAT, 0, p);
Marshal.FreeCoTaskMem(p);

以上ですが、現状SendMessageの戻り値がエラーの0なので間違っていることは確定です。

私が知りたいのは、
・そもそも行間を詰めることはできるのか
・上記の方法は正しいのか
の2点です。

因みに調べていくうちにEM_SETCHARFORMATをSendMessageする方法も試したのですが、
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/CHARFORMAT.html
こちらは行間とは違うようでした。(SendMessage自体は成功しました)

本当に恐縮ではありますが、どなたかご教授頂けないでしょうか。
引用返信 編集キー/
■8672 / inTopicNo.2)  Re[1]: RichTextBoxの行間を詰める方法
□投稿者/ mあ (89回)-(2007/10/06(Sat) 01:27:07)
No8671 (tk さん) に返信
> いつもお世話になっております。
>
> 調べに調べたのですが、ここを最終手段として質問させてください。
>
> 表題の通り、RichTextBoxの行間を詰める方法ですが、
> どうやらPARAFORMAT2構造体をSendMessageするというのが妥当みたいです。
> ただこれを実現しているサンプルがなかったので、この方法自体有用なのかは
> わかりません。

http://ir9.jp/prog/ayu/datlog/tech_win32api/1081702990/1081702990_02.html
2ch - できない。

http://www.arcpit.co.jp/apb_v14.htm
REの拡張版

http://www.xn--kdw9a025vfod.com/bbs/pastlog/11500/11405.html
必死なんだが・・・


>[MarshalAs(UnmanagedType.I4, SizeConst = 32)] //←ここの書き方怪しい・・・
構造体のパディングはMSDNにちゃんと載っているから調べた方がいいよ。
WEBにも親切な方が詳細に解説しているページがあるから。



richTextBox を選択して、フォームに貼り付けるだけでおしまいじゃぁないの?

ちなみに、行間ってどれくらい空いているの?フォントサイズはいくつ?

うちの環境では、MS UI Gothic 9pt(デフォルト) で行間は、3〜6ドット程度だよ。
フォントの高さの1/3 くらい。



# 我が家の .NET Framework は 3.0 です。
# 2.0 と 3.0 で劇的に RichTextBox の仕様が変わったのでしょうかね・・・・???







引用返信 編集キー/
■8673 / inTopicNo.3)  Re[2]: RichTextBoxの行間を詰める方法
□投稿者/ mあ (90回)-(2007/10/06(Sat) 01:36:22)
2007/10/06(Sat) 01:39:21 編集(投稿者)

http://search.msdn.microsoft.com/search/Default.aspx?query=paraformat2&brand=msdn&locale=ja-jp&refinement=00&lang=ja-jp

RichEdit
しか見つからんよ。

http://msdn2.microsoft.com/ja-jp/library/ms651894(en-us).aspx
PARAFORMAT2 構造体


引用返信 編集キー/
■8675 / inTopicNo.4)  Re[1]: RichTextBoxの行間を詰める方法
□投稿者/ 花ちゃん (1回)-(2007/10/06(Sat) 08:07:54)
花ちゃん さんの Web サイト
> 表題の通り、RichTextBoxの行間を詰める方法ですが、
> どうやらPARAFORMAT2構造体をSendMessageするというのが妥当みたいです。
> ただこれを実現しているサンプルがなかったので、この方法自体有用なのかは
> わかりません。

下記のような事がやりたいと言う事でしょうか?
http://hanatyan.sakura.ne.jp/samplepic/vb8_145.htm
引用返信 編集キー/
■8677 / inTopicNo.5)  Re[2]: RichTextBoxの行間を詰める方法
□投稿者/ tk (14回)-(2007/10/06(Sat) 10:58:41)
mあ様>

たくさんの情報ありがとうございます。

> http://ir9.jp/prog/ayu/datlog/tech_win32api/1081702990/1081702990_02.html
> 2ch - できない。
はい、これは私も見つけましたが、EM_SETCHARFORMATのフォント設定変更は
実現できたので、できると思いやろうとしてました。

> http://www.arcpit.co.jp/apb_v14.htm
> REの拡張版
まだよく見てないですが、よさそうですね。調べてみてこれでできそうなら
使わせていただきます。

> >[MarshalAs(UnmanagedType.I4, SizeConst = 32)] //←ここの書き方怪しい・・・
> 構造体のパディングはMSDNにちゃんと載っているから調べた方がいいよ。
> WEBにも親切な方が詳細に解説しているページがあるから。
すいません、もしご存知であれば詳しいサイトを教えていただきたいです。
アンマネージ用のマネージのintの配列の方法が知りたいです。


> ちなみに、行間ってどれくらい空いているの?フォントサイズはいくつ?
MSゴシック 9ptですが、フォントの高さの1/3 くらいは空いています。
やりたいのはテキストエディタのような行間の狭さです。

> # 我が家の .NET Framework は 3.0 です。
> # 2.0 と 3.0 で劇的に RichTextBox の仕様が変わったのでしょうかね・・・・???
私の環境も3.0でした。

花ちゃん様>

> 下記のような事がやりたいと言う事でしょうか?
> http://hanatyan.sakura.ne.jp/samplepic/vb8_145.htm
はい、行間をいじるという意味ではそういう事です。
テキストエディタのように狭めたいのです。
そちらのサイト見つけてて、VBですが.NetなのでC#でも出来ると思って
試行錯誤したのが、TOPのコードでした。


引用返信 編集キー/
■8706 / inTopicNo.6)  Re[1]: RichTextBoxの行間を詰める方法
□投稿者/ 車 探偵長 (1回)-(2007/10/08(Mon) 11:21:02)
No8671 (tk さん) に返信
> //適当な値をセットして
> cf.cbSize = (uint)Marshal.SizeOf(new ChildRichEdit.CHARFORMAT());

cbSizeは構造体のサイズが入るのだと思います。
PARAFORMAT2構造体のサイズは188バイトのはずですので188かと。

http://yokohama.cool.ne.jp/chokuto/urawaza/index.html
HSPの裏技??(ちょくとさんのサイト内)に構造体リストが載っております。
あいにくPARAFORMAT「2」構造体は載っておりませんが、
PARAFORMAT構造体に関しては記載されております。
多少は参考になるのではないかと。



引用返信 編集キー/
■8707 / inTopicNo.7)  Re[1]: RichTextBoxの行間を詰める方法
□投稿者/ 魔界の仮面弁士 (449回)-(2007/10/08(Mon) 15:50:55)
No8671 (tk さん) に返信
> 	[MarshalAs(UnmanagedType.I4, SizeConst = 32)]	//←ここの書き方怪しい・・・
> 	public int rgxTabs;

(案1) public fixed int rgxTabs[MAX_TAB_STOPS];

(案2) [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_TAB_STOPS)] public int[] rgxTabs;


> 	const uint PFM_LINESPACING = 0x00000100;
間違いでは無いですが、両辺の型を合わせて置いた方が良いかと。
         const uint PFM_LINESPACING = 0x00000100u;


> 	//適当な値をセットして
> 	cf.cbSize = (uint)Marshal.SizeOf(new ChildRichEdit.CHARFORMAT());
SizeOf メソッドの引数は typeof(PARAFORMAT2) ですね。

引用返信 編集キー/
■8708 / inTopicNo.8)  Re[3]: RichTextBoxの行間を詰める方法
□投稿者/ 魔界の仮面弁士 (450回)-(2007/10/08(Mon) 16:30:06)
No8677 (tk さん) に返信
> MSゴシック 9ptですが、フォントの高さの1/3 くらいは空いています。
> やりたいのはテキストエディタのような行間の狭さです。

「やりたいこと」に即しているかどうかはともかくとして、とりあえず、こんな感じで行間は変化しました。
行間によっては、文字の一部が切れるのでご注意あれ。

//-------------------------------
// PARAFORMAT2 の宣言方法については、先述の No8707 の通り。

[DllImport("user32", SetLastError = true)]
static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref PARAFORMAT2 lParam);

private void button1_Click(object sender, EventArgs e)
{
    int size = Marshal.SizeOf(typeof(PARAFORMAT2));

    PARAFORMAT2 pf = new PARAFORMAT2();
    pf.cbSize = (uint)size;
    //pf.rgxTabs = new int[MAX_TAB_STOPS];
    pf.dwMask |= PFM_LINESPACING;
    pf.bLineSpacingRule = 4;
    //pf.dyLineSpacing = (int)numericUpDown1.Value;
    pf.dyLineSpacing = 210;

    int start = richTextBox1.SelectionStart;
    int length = richTextBox1.SelectionLength;
    richTextBox1.SelectAll();

    /* int ret = */ SendMessage(richTextBox1.Handle, EM_SETPARAFORMAT, IntPtr.Zero,ref pf);

    richTextBox1.Select(start, length);
}

引用返信 編集キー/
■8937 / inTopicNo.9)  Re[2]: RichTextBoxの行間を詰める方法
□投稿者/ tk (15回)-(2007/10/14(Sun) 18:06:13)
返信が遅れて大変申し訳ございません。

色々試してたら、RichTextBoxの入力フォントだけ違うという問題を直すと一緒に
行間を詰めることができました!むしろそのフォントのいつもの行間になりました。
たった一行です!2.0からできたプロパティみたいです!

RichTextBox.LanguageOption = RichTextBoxLanguageOptions.UIFonts;

まぐれで出来たとはいえうれしいです。
ヒントはここから見つけました。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1198037&SiteID=7

魔界の仮面弁士様
車 探偵長様
アドバイスを頂き本当に有難うございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -