Rich Text Box padding between text and border
I had this same problem and the answer described didn't help me, this worked for me so i'll share it if it helps.
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;
The RichTextBox has no padding property.
Quick and dirty padding can be achieved by putting the RichTextBox in a Panel, which has the same BackColor
property as the RichTextBox (usually Color.White
).
Then, set the Dock
property of the RichTextBox to Fill
, and play with the Padding
properties of the Panel control.
There are EM_GETRECT
and EM_SETRECT
.
Combining those two together, you can make this:
â¦look like this:
I've written a small C# extension class to wrap this all up.
Usage example:
const int dist = 24;
richTextBox1.SetInnerMargins(dist, dist, dist, 0);
This sets the inner margins left, top and right to 24, leaving the bottom as zero.
Please note that when scrolling, the top margin stays as being set, giving something like this:
Personally, this looks "unnatural" to me. I would prefer that when scrolling the top margin becomes zero, too.
Maybe there is a workaround for thatâ¦
Full source code
As of request:
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;
}
}
A quick and easy way is to offset text from vertical scroll, by calling this example method at form load and at form/control resize events:
private void AdjustTextBoxRMargin()
{
richTextBox1.RightMargin = richTextBox1.Size.Width - 35;
}
The value of 35 seems to work for Win7, but may differ on other versions of Windows.