Дополнение между текстовым полем и рамкой - PullRequest
20 голосов
/ 26 мая 2010

Можно ли добавить заполнение в элемент управления Rich Text Box между текстом и границей?

Я попытался закрепить поле Rich Text Box внутри панели, для которого для всех четырех сторон было установлено значение 10и это выполнило то, что я хотел.За исключением случаев, когда требуется вертикальная полоса прокрутки для расширенного текстового поля, которое также дополняется.

Ответы [ 8 ]

27 голосов
/ 15 декабря 2011

RichTextBox не имеет свойства заполнения.

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

Затем установите для свойства Dock RichTextBox значение Fill и поиграйте со свойствами Padding элемента управления Panel.

22 голосов
/ 05 ноября 2015

Есть EM_GETRECT и EM_SETRECT.

Объединяя эти два вместе, вы можете сделать это:

enter image description here

… выглядит так:

enter image description here

Я написал небольшой класс расширения C # , чтобы обернуть это все.

Пример использования:

const int dist = 24;
richTextBox1.SetInnerMargins(dist, dist, dist, 0);

Устанавливает внутренние поля слева, сверху и справа равными 24, оставляя низ равным нулю.

Обратите внимание, что при прокрутке верхнее поле остается установленным, давая что-то вроде этого:

enter image description here

Лично мне это кажется "неестественным". Я бы предпочел, чтобы при прокрутке верхнее поле тоже становилось равным нулю.

Может быть, есть обходной путь для этого ...

Полный исходный код

По запросу:

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;
    }
}
10 голосов
/ 09 июня 2014

У меня была такая же проблема, и описанный ответ не помог мне, это сработало для меня, поэтому я поделюсь им, если это поможет.

richTextBox1.SelectAll();
richTextBox1.SelectionIndent += 15;//play with this values to match yours
richTextBox1.SelectionRightIndent += 15;//this too
richTextBox1.SelectionLength = 0;
//this is a little hack because without this
//i've got the first line of my richTB selected anyway.
richTextBox1.SelectionBackColor = richTextBox1.BackColor;
6 голосов
/ 23 октября 2012

Быстрый и простой способ - сместить текст от вертикальной прокрутки, вызывая этот пример метода при загрузке формы и при изменении размера формы / элемента управления:

private void AdjustTextBoxRMargin()
{
    richTextBox1.RightMargin = richTextBox1.Size.Width - 35;
}

Значение 35, похоже, работает для Win7, но может отличаться в других версиях Windows.

3 голосов
/ 07 июля 2014

Поскольку RichTextBox не имеет свойства заполнения. Вы можете создать свой собственный RichTextBoxSubclass, как показано в этой статье:

http://www.codeproject.com/Articles/21437/A-Padded-Rich-Text-Box-Subclass

1 голос
/ 20 марта 2014

Может быть, это то, что вам нужно?

richTextBox.SelectionIndent += 20;
0 голосов
/ 29 июня 2010

Возможно, вы ищете отступ для текста? Как левый и правый отступ? Если это так, то вы можете просто использовать методы ReGEtIndent и ReSetIndent объекта rtf.

Вот что я делаю:

//first I find the length of the active window

nLen := REGEtIndent( ::oActive:hWnd )    
//now resetIndents of the rtf control    
RESetIndent( ::oActive:hWnd, nLen[ 1 ] + 100, nLen[ 2 ] + 100, -25 )

Надеюсь, это поможет.

0 голосов
/ 26 мая 2010

Установите отступ справа на 0, а затем установите RightMargin RichTextBox на 10. Не проверено, но должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...