質問

.NET RichTextBoxでデフォルトのタブサイズを変更する方法はありますか? 現在は、8つのスペースに相当するように設定されているようです。

編集:明確にするために、グローバルデフォルトの" \ t"を設定します。コントロールの4つのスペースとして表示されます。私が理解できることから、SelectionTabsプロパティでは、最初にすべてのテキストを選択し、次に配列を介してタブ幅を選択する必要があります。必要に応じてこれを行いますが、可能であれば、グローバルなデフォルトを一度変更するだけで、毎回それを行う必要はありません。

役に立ちましたか?

解決

SelectionTabsを設定することで設定できます。 プロパティ。

private void Form1_Load(object sender, EventArgs e)
{
    richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
}

更新:
順序は重要です。...

コントロールのテキストが初期化される前にタブを設定した場合、タブを設定する前にテキストを選択する必要はありません。

たとえば、上記のコードでは、テキストは元の8スペースのタブストップで保持されます。

richTextBox1.Text = "\t1\t2\t3\t4";
richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };

しかし、これは新しいものを使用します:

richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
richTextBox1.Text = "\t1\t2\t3\t4";

他のヒント

Winformsには、RichTexBoxのデフォルトのタブサイズを1つの数字で設定するプロパティはありませんが、リッチテキストボックスのRtfを掘り下げて変更する準備ができている場合は、設定が可能です呼ばれる使用:" \ deftab"。その後の数字は、トゥイップの数を示します(1ポイント= 1/72インチ= 20トゥイップ)。 720 twipの標準タブサイズの結果のRtfは、次のようになります。

{\rtf1\ansi\ansicpg1252\deff0\deflang2057\deftab720{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs41
1\tab 2\tab 3\tab 4\tab 5\par
}

twipをピクセルに変換する必要がある場合は、ピクセルをポイントに変換

int tabSize=720;
Graphics g = this.CreateGraphics();
int pixels = (int)Math.Round(((double)tabSize) / 1440.0 * g.DpiX);
g.Dispose();

固定ピッチテキストの表示(読み取り専用)にのみ使用されるRTFボックスがある場合、最も簡単な方法は、タブストップをいじらないことです。それらをスペースに置き換えるだけです。

ユーザーが何かを入力し、そのTabキーを使用して先に進めたい場合は、 OnKeyDown()をオーバーライドしてTabキーをキャプチャし、代わりにスペースを印刷することもできます。

これまで誰もこの方法を提案していないのは奇妙です)

RichTextBox を継承し、CmdKeyハンドラーを書き換えることができます( ProcessCmdKey
次のようになります。

public class TabRichTextBox : RichTextBox
{
    [Browsable(true), Category("Settings")]
    public int TabSize { get; set; } = 4;

    protected override bool ProcessCmdKey(ref Message Msg, Keys KeyData)
    {

        const int WM_KEYDOWN = 0x100;       // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keydown
        const int WM_SYSKEYDOWN = 0x104;    // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-syskeydown
        // Tab has been pressed
        if ((Msg.Msg == WM_KEYDOWN || Msg.Msg == WM_SYSKEYDOWN) && KeyData.HasFlag(Keys.Tab))
        {
            // Let's create a string of spaces, which length == TabSize
            // And then assign it to the current position
            SelectedText += new string(' ', TabSize);

            // Tab processed
            return true;
        }
        return base.ProcessCmdKey(ref Msg, KeyData);
    }
}

今、 Tab を押すと、 \ t

の代わりに指定された数のスペースがコントロール領域に挿入されます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top