I\'m a newbie, and recently I\'ve asked this question, where it taught me to have my best option for TextBox\'s bottom border, that prevents flickering/tearing - resulted by
You can set left padding and right padding for text of TextBox
by sending an EM_SETMARGINS. You also can set AutoSize
property of the TextBox
to false to be able to change the height of control.
Here is the result:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
public class ExTextBox : TextBox
{
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, int msg,
int wParam, int lParam);
private const int EM_SETMARGINS = 0xd3;
private const int EC_RIGHTMARGIN = 2;
private const int EC_LEFTMARGIN = 1;
private int p = 10;
public ExTextBox()
: base()
{
var b = new Label { Dock = DockStyle.Bottom, Height = 2, BackColor = Color.Gray };
var l = new Label { Dock = DockStyle.Left, Width = p, BackColor = Color.White };
var r = new Label { Dock = DockStyle.Right, Width = p, BackColor = Color.White };
AutoSize = false;
Padding = new Padding(0);
BorderStyle = System.Windows.Forms.BorderStyle.None;
Controls.AddRange(new Control[] { l, r, b });
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
SetMargin();
}
private void SetMargin()
{
SendMessage(Handle, EM_SETMARGINS, EC_RIGHTMARGIN, p << 16);
SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN, p);
}
}
To know what the role of right label is, try not adding it to the control, then write a long text to TextBox
and go to the end of text by arrow keys and again back to the beginning using arrow keys.