C#のTextBoxやRichTextBoxのタブサイズを変える方法
C#のTextBoxやRichTextBoxではTabサイズを変更するプロパティやメソッドは存在しません。変更する場合はWindowsAPIを使う必要があります。
デフォルトのタブ幅は5文字のようです。個人的にはこれだとちょっと大きいんですよね。3文字くらいが個人的にちょうどいいです。
[ad#top-1]
Windows API を使う
最初に初期設定として以下の宣言をしておきます。コンストラクタの上あたりに書きましょう。
//Tabサイズの設定 [System.Runtime.InteropServices.DllImport( "User32.dll" )] static extern IntPtr SendMessage( IntPtr hWnd, int msg, int wParam, int[] lParam );
で、TextBoxまたはRichTextBoxを生成した後に、以下のコードを追加しましょう。例はタブサイズを3文字としています。(tabSize変数がそれ)
//タブサイズの設定 int tabSize = 3; int tabWidth = (int)(tabSize * 3 * 96 / 72); SendMessage( textBox.Handle, 0x00CB, 1, new int[]{ tabWidth } );
tabSize値に、3と96を掛けて72で割った値をSendMessageの第二引数に入れると、文字tabSize個分のタブになります。上の例ではタブサイズを3で設定しています。
実行すると以下の通りタブサイズが3となりました。
文字サイズを変えてもご覧の通り3文字分のタブサイズになってくれます。
ソースコード全文
こちらがソースコード全文です。RichTextBoxを使用しているので、前に紹介したフォントが勝手に変わらないためのAPIも入れています。
using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; class TabTest{ static void Main(string[] args){ Application.Run(new MainWindow(args)); } } class MainWindow : Form{ private RichTextBox textBox; //RichTextBoxでフォントが勝手に変わらないためのAPI用 private const uint IMF_DUALFONT = 0x80; private const uint WM_USER = 0x0400; private const uint EM_SETLANGOPTIONS = WM_USER + 120; private const uint EM_GETLANGOPTIONS = WM_USER + 121; [System.Runtime.InteropServices.DllImport("USER32.dll")] private static extern uint SendMessage(System.IntPtr hWnd, uint msg, uint wParam, uint lParam); //Tabサイズの設定 [System.Runtime.InteropServices.DllImport( "User32.dll" )] static extern IntPtr SendMessage( IntPtr hWnd, int msg, int wParam, int[] lParam ); public MainWindow(string[] args){ this.StartPosition = FormStartPosition.CenterScreen; this.Width = 600; this.Height =400; this.Text = "テキストボックステスト"; textBox = new RichTextBox(){ Dock = DockStyle.Fill, Font = new Font("MS ゴシック", 20), AcceptsTab = true, WordWrap = false, Parent=this, }; textBox.KeyDown += new KeyEventHandler(keyDowned); //RichTextBoxでフォントが勝手に変わらないための処置 uint lParam; lParam = SendMessage(this.textBox.Handle, EM_GETLANGOPTIONS, 0, 0); lParam &= ~IMF_DUALFONT; SendMessage(this.textBox.Handle, EM_SETLANGOPTIONS, 0, lParam); //タブサイズの設定 int tabSize = 3; int tabWidth = (int)(tabSize * 3 * 96 / 72); SendMessage( textBox.Handle, 0x00CB, 1, new int[]{ tabWidth } ); } }
[ad#ad-1]
スポンサーリンク