RichTextBox에서 기본 탭 크기를 수정합니다
-
03-07-2019 - |
문제
.NET RichTextBox에서 기본 탭 크기를 변경할 수있는 방법이 있습니까? 그것은 현재 내 취향에 큰 공간에 해당하는 것으로 보입니다.
편집 : 명확히하기 위해, " t"표시의 전역 기본값을 컨트롤을위한 4 개의 공간으로 설정하고 싶습니다. 내가 이해할 수있는 바에 따르면, selectionTabs 속성은 먼저 모든 텍스트를 선택한 다음 배열을 통해 탭 너비를 선택해야합니다. 내가해야한다면 이것을 할 것입니다. 그러나 가능하면 매번 그렇게 할 필요가없는 SOT를 한 번만 변경합니다.
해결책
설정하여 설정할 수 있습니다 선택 탭 재산.
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의 기본 탭 크기를 단일 숫자로 설정할 속성이 없지만 Rich Text Box의 RTF를 파헤 치고 수정할 준비가되면 다음을 사용할 수 있습니다. " deftab". 그 후 숫자는 트윈의 수를 나타냅니다 (1 포인트 = 1/72 인치 = 20 twips). 표준 탭 크기가 720 트윈의 결과 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
}
트윈을 픽셀로 변환 해야하는 경우 영감을 얻은이 코드를 사용하십시오. 픽셀을 포인트로 변환합니다:
int tabSize=720;
Graphics g = this.CreateGraphics();
int pixels = (int)Math.Round(((double)tabSize) / 1440.0 * g.DpiX);
g.Dispose();
고정 피치 텍스트를 표시하는 데 사용되는 RTF 상자가있는 경우 가장 쉬운 것은 탭 정지를 사용하여 엉망이되지 않습니다. 단순히 물건을 공백으로 교체하십시오.
사용자가 무언가를 입력하고 해당 탭 키를 사용하여 진행할 수 있으려면 재정의하여 탭 키를 캡처 할 수도 있습니다. OnKeyDown()
대신 공간을 인쇄합니다.
아무도이 방법에 대해이 방법을 제안하지 않았다는 것은 이상합니다)
우리는에서 상속 될 수 있습니다 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);
}
}
이제 누가 누를 때 탭, 지정된 수의 공간이 대신 제어 영역에 삽입됩니다. \t