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

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

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

Re[7]: リッチテキストボックスのタブ幅を文字数単位で設定


(過去ログ 108 を表示中)

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

■64356 / inTopicNo.1)  リッチテキストボックスのタブ幅を文字数単位で設定
  
□投稿者/ ホエホエ (11回)-(2012/11/29(Thu) 10:52:04)

分類:[.NET 全般] 

いつもお世話になっております、ホエホエです。

タイトルにもありますが、リッチテキストボックスの
タブ幅を文字数で設定したいのですがうまくいきません。

Googleで検索していろいろと方法が出てきたのですが、文字数からピクセル数を計算し
Windows APIのSendMessageにて設定しようと思い下記コードになりました。

const int EM_SETTABSTOPS = 0x00CB;

[DllImport( "User32.dll" )]
static extern IntPtr SendMessage( IntPtr hWnd, int msg, int wParam, int[] lParam );

private void button1_Click( object sender, EventArgs e )
{
  using( Graphics grpText = richTextBox1.CreateGraphics() )
  {
    int nTabCharNum = (int)4;
    int nTabWidth = (int)(richTextBox1.Font.SizeInPoints * 96 / 72 / 2 * nTabCharNum);

    SendMessage( richTextBox1.Handle, EM_SETTABSTOPS, 1, new int[] { nTabWidth } );
  }
  richTextBox1.Text = "12345678901234567890\r\n\tAAA";
}

上記のタブ文字数4(半角単位)として実行すれば私としては1234.....の次に改行されて、
「AAA」と言う文字が「5」の直下に来る予定が「6」の直下に来てと1文字ほどズレてしまい、
設定するタブ文字数を大きくすればするほどズレ文字数が大きくなってしまいます。
タブのピクセルサイズ計算に何か誤りがあるのか、それとももっと根本的に問題あるのか…

他にもリッチテキストのグラフィックを取得しMeasureStringメソッドでサイズを取得する方法も
試してみましたがダメでした。

ちなみに環境は
Windows7
VisualStudio2010
です。

ご存知の方、教えてください。
引用返信 編集キー/
■64357 / inTopicNo.2)  Re[1]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ shu (101回)-(2012/11/29(Thu) 11:00:20)
No64356 (ホエホエ さん) に返信

文字数単位なのでFontにより文字毎の幅に相違が出ると思うので
それでずれているということはないですか?
等幅のフォントを指定してみてはどうでしょう?
引用返信 編集キー/
■64358 / inTopicNo.3)  Re[2]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ ホエホエ (12回)-(2012/11/29(Thu) 11:31:09)
shuさん>
ご返信ありがとうございます。

早速ご指摘いただいた内容を試すために、リッチテキストはDualFontのため
テスト対象を通常のテキストボックスに変更し、設定フォントを
等幅フォントであるMSゴシックに変更してためしてみましたがダメでした。
引用返信 編集キー/
■64359 / inTopicNo.4)  Re[3]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ shu (102回)-(2012/11/29(Thu) 11:52:27)
No64358 (ホエホエ さん) に返信
> shuさん>
> ご返信ありがとうございます。
>
> 早速ご指摘いただいた内容を試すために、リッチテキストはDualFontのため
> テスト対象を通常のテキストボックスに変更し、設定フォントを
> 等幅フォントであるMSゴシックに変更してためしてみましたがダメでした。

提示コードをよく見たら
nTabWidth でなくnTabCharNum を指定するだけでよい気がします。

ドボンさんのサイトより
http://dobon.net/vb/dotnet/control/tbtacwidth.html
引用返信 編集キー/
■64360 / inTopicNo.5)  Re[3]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ howling (105回)-(2012/11/29(Thu) 11:54:11)
ホエホエ さん

んー、確かにやってみたいことなので気になっているのですが、
GDIとかの問題なのかな???
ちょっと気になったURLがコレ。
http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200911/09110030.txt

やれるとかっこいいですもんね。
引用返信 編集キー/
■64361 / inTopicNo.6)  Re[4]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ howling (106回)-(2012/11/29(Thu) 12:33:58)
うーん…確かに
> nTabWidth でなくnTabCharNum を指定するだけでよい気がします。
これは正しいようですね。

MSゴシックで計測すると、フォントサイズに関わらず半角1文字=4にあたるようなのですが、
なんで4なんだろう…。

ちなみに、(MeasureTextで2文字指定) - (MeasureTextで1文字指定)は、
1文字のサイズ自体は取れるようで、フォントによって変動しました。(これは予想通り)

この半角1文字=4の値が取れるような何かがあれば良いのですが、見当たりません。
ここらへん、手入れされていないようなのでめんどくさそうですが…。
(やっぱり同じような質問はあるのですが、純粋な描画文字幅が欲しいという質問ばかりですね…)
引用返信 編集キー/
■64363 / inTopicNo.7)  Re[5]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ ホエホエ (13回)-(2012/11/29(Thu) 13:09:03)
shuさん>
howlingさん>
ご返信ありがとうございます。

ご指摘いただきました通り、nTabCharNumを4倍した値をセットしてやり、
さらに等幅フォント設定のテキストボックスであればフォントサイズを
どう変更しようとも思ってたような動作になりました。

ただリッチテキストでうまくいかないのはDualFontが影響しているせいなのか、
それともSendMessageで設定する方法自体が普通のテキストボックスにしか
対応していないのでしょうか?
引用返信 編集キー/
■64364 / inTopicNo.8)  Re[6]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ shu (103回)-(2012/11/29(Thu) 13:34:24)
No64363 (ホエホエ さん) に返信

C++Builderのサイトですが
lParam に指定する数値の単位についてかいてありました。
http://support.embarcadero.com/article/35940
引用返信 編集キー/
■64366 / inTopicNo.9)  Re[6]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ shu (104回)-(2012/11/29(Thu) 13:47:53)
EM_SETTABSTOPS の説明
http://msdn.microsoft.com/ja-jp/library/windows/desktop/bb761663(v=vs.85).aspx

lParam
〜 in dialog template units
=> ダイアログテンプレート単位というもので指定する。と書かれている


http://blog.umn-cs.com/article/38793065.html
のサイトにダイアログベース単位、ダイアログテンプレート単位について書かれていて
これより同じことが分かります。

引用返信 編集キー/
■64377 / inTopicNo.10)  Re[7]: リッチテキストボックスのタブ幅を文字数単位で設定
□投稿者/ ホエホエ (14回)-(2012/11/30(Fri) 10:11:34)
shuさん>
ご返信ありがとうございます。

教えていただいた参考サイトの内容のおかげで、実施したい内容が
実現できました。ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -