テキストボックスでタブ文字の幅(Tabのサイズ)を設定する [C#] TextBox

Windowsフォームのテキストボックス(System.Windows.Forms名前空間にあるTextBoxクラスとRichTextBoxクラス)のタブ文字のサイズ(幅)を設定する方法を紹介します。

テキストボックスにタブ文字を入力できるようにした際のタブ文字の幅は、デフォルト(既定値)では8文字になっています。これを任意の文字幅に設定できるようにします。

WindowsフォームのTextBoxコントロールには、タブ文字の幅を設定するためのプロパティは用意されていません。
RichTextBoxコントロールには、SelectionTabsというタブの位置を設定することができるプロパティがあります。
しかしこれは、RichTextBoxコントロール内のタブストップの絶対位置を取得または設定するもので、タブの位置をピクセル単位の数値で指定するものです。
Selectionという名前からも想像がつくように、現在選択されているテキストの各タブの間隔を格納している配列を操作するプロパティなので、設定するためにはいったんテキストを選択しなければなりません。しかも、配列の数は32個までという制限もあります。

今回ご紹介するタブ文字の幅を設定する方法であれば、選択文字や設定数の制限などなく自由に設定できます。

タブ文字の幅を設定するWindows API

Windowsフォームのテキストボックスには、タブ文字の幅を設定するためのプロパティがありませんので、Windows API(Win32 API)を利用します。
Windows APIを利用する際は、使用するライブラリ(dll)をインポートする属性を指定して、使用するメソッドを宣言します。

テキストボックスのタブ文字の幅を設定するためには「user32.dll」の「SendMessage」メソッドを使用しますので、以下のように宣言します。

参考
SendMessage function
EM_SETTABSTOPS message

宣言したメソッドの使用

宣言したWindows APIのメソッドは、.NET Frameworkの他のクラスのメソッドと同様に使用できます。

1つ目のパラメーターのhWndには、タブ文字の幅を設定するテキストボックスのウィンドウハンドルを指定します。
2つ目のパラメーターのmsgには、203を指定します。
3つ目のパラメーターのwParamには、1を指定します。
4つ目のパラメーターのlParamには、設定するタブ文字の幅を要素を1つ持つ配列で指定します。

タブ文字の幅は文字数ではなく、文字数×4の値を指定します。例えばタブ文字の幅を4文字分にするのであれば、4×4=16を指定することになります。

サンプルプログラム

サンプルとしてテキストボックスのタブ文字の幅を画面で設定できるプログラムを作成します。

ユーザーインターフェース

フォームにはテキストを編集するテキストボックス(textBox1)とタブ文字の幅などを設定するコントロールを配置するパネル(panel1)を配置します。
パネルの中には、タブ文字の幅を指定するテキストボックス(numericUpDown1)、フォントを設定するボタン(button1)、タブ文字の幅を設定するボタン(button2)を配置します。

テキストボックスのタブ文字の幅を設定するサンプルプログラムのフォームデザイン

ソースコード

プログラムの実行

作成したプログラムをビルドして実行(デバッグ)します。

テキストボックスのタブ文字の幅を設定するサンプルプログラムを実行

タブ文字を入力します。
デフォルト(既定値)では8文字分の幅がとられています。

テキストボックスのタブ文字の幅を設定するサンプルプログラムでタブ文字を入力

タブ文字の幅を4文字にします。

テキストボックスのタブ文字の幅を設定するサンプルプログラムでタブ文字の幅に4を入力

「タブ幅変更」ボタンをクリックしてタブ文字の幅を設定します。

テキストボックスのタブ文字の幅を設定するサンプルプログラムでタブ文字の幅を4文字に設定

タブ文字の幅が4文字分になりました。