Задать отступы в RichTextBox

283
07 июня 2017, 00:59

Как сделать отступы от края RichTextBox до текста? Эти отступы должны быть всегда, так как текст по умолчанию находится слишком близко к краю RichTextBox. Пример на картинке.

Answer 1

RichTextBox не имеет такого свойства.

Быстрое решение может быть достигнуто путем помещения RichTextBox в Panel, которая имеет такое же свойство BackColor, что и RichTextBox (обычно Color.White).

Затем установите свойство Dock для RichTextBox для заполнения и задайте через свойство Padding контрола Panel необходимый отступ.

Источник

Answer 2

Расширьте методы RichTextBox:

public static class RichTextBoxExtensions
{
    public static void SetInnerMargins(this TextBoxBase textBox, int left, int top, int right, int bottom)
    {
        var rect = textBox.GetFormattingRect();
        var newRect = new Rectangle(left, top, rect.Width - left - right, rect.Height - top - bottom);
        textBox.SetFormattingRect(newRect);
    }
    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public readonly int Left;
        public readonly int Top;
        public readonly int Right;
        public readonly int Bottom;
        private RECT(int left, int top, int right, int bottom)
        {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }
        public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
        {
        }
    }
    [DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
    private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect);
    [DllImport(@"user32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);
    private const int EmGetrect = 0xB2;
    private const int EmSetrect = 0xB3;
    private static void SetFormattingRect(this TextBoxBase textbox, Rectangle rect)
    {
        var rc = new RECT(rect);
        SendMessageRefRect(textbox.Handle, EmSetrect, 0, ref rc);
    }
    private static Rectangle GetFormattingRect(this TextBoxBase textbox)
    {
        var rect = new Rectangle();
        SendMessage(textbox.Handle, EmGetrect, (IntPtr)0, ref rect);
        return rect;
    }
}

Дальше в Form_Load используйте добавленные методы:

private void Form1_Load(object sender, EventArgs e)
{
    int m = 24; // m - margin
    richTextBox1.SetInnerMargins(m, m, m, 0); 
}

Оригинал ответа: https://stackoverflow.com/a/33542937/7099599

Answer 3

См. свойства SelectionIndent, SelectionRightIndent, SelectionHangingIndent.

richTextBox1.SelectionIndent = 50; 

Это обеспечит отступ в 50 пикселей для всего текста от левого края контрола.

READ ALSO
Подключение dll файла через интернет

Подключение dll файла через интернет

Всем привет! Разрабатываю одну программу (с платной подпиской), хочу сделать так, чтобы программа брала все библиотеки с моего сервера (при...

255
SharpDX: поворот текста - DirectX

SharpDX: поворот текста - DirectX

Здравствуйте! Возникла проблема при рендеринге текста(TextRender) на связи(Connection) во время зуммирования

176
JS счетчик и смена блока

JS счетчик и смена блока

Здравствуйте! у меня есть 2 странички, одна с отсчетом времени (стоит счетчик), другая с контентомМне нужно чтобы страничка с СЧЕТЧИКОМ, КАЖДЫЙ...

402