自定义文本框在非编辑模式下按预期显示文本,如何在编辑模式下显示垂直居中、字体相同且不重叠的文本?
文本框必须允许设置高度而不影响字体大小,反之亦然
我的自定义文本框代码:
public partial class TextboxCommon : TextBox
{
public TextboxCommon() : base()
{
SetStyle(ControlStyles.UserPaint, true);
AutoSize = false;
BorderStyle = BorderStyle.None;
TextAlign = HorizontalAlignment.Left;
Font = new Font("Calibri light", 16, GraphicsUnit.Point);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen penBorder = new Pen(Color.Red, 1);
Rectangle rectBorder = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
e.Graphics.DrawRectangle(penBorder, rectBorder);
Brush brush = new SolidBrush(Color.Purple);
StringFormat stringFormat = new StringFormat
{
LineAlignment = StringAlignment.Center,
Alignment = StringAlignment.Near
};
e.Graphics.DrawString(Text, this.Font, brush, rectBorder, stringFormat);
}
}
由于更改 Windows 窗体组件的绘图功能有点复杂,需要仔细注意许多未记录的问题,另一方面,不能保证它在未来版本的 Windows 中完全正确,因此我建议使用更简单的方法:
创建一个不继承自TextBox的UserControl并重写其OnPaint方法,如下所示。然后将一个文本框拖放到该用户控件内。不必将 TextBox 的尺寸与 UserControl 的尺寸相匹配。因为代码应用了尺寸设置。 我们知道,在复制项目中的代码之前,必须双击UserControl的空白区域来创建OnLoad方法。 如果您希望我们的控制器更专业,您可以将 BorderColor 和 BorderThickness 常量定义为 UserControl 中的已发布属性。
public partial class TextboxCommon : UserControl
{
public static Color BorderColor = Color.Red;
public const int BorderThickness = 1;
public TextboxCommon()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen penBorder = new Pen(BorderColor, 1);
Rectangle rectBorder = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
e.Graphics.DrawRectangle(penBorder, rectBorder);
}
private void CommonTextBox_Load(object sender, EventArgs e)
{
textBox1.AutoSize = false;
textBox1.SetBounds(ClientRectangle.X + BorderThickness, ClientRectangle.Y + BorderThickness, ClientRectangle.Width - 2 * BorderThickness, ClientRectangle.Height - 2 * BorderThickness);
textBox1.BorderStyle = BorderStyle.None;
textBox1.TextAlign = HorizontalAlignment.Left;
textBox1.Font = new Font("Calibri light", 16, GraphicsUnit.Point);
textBox1.ForeColor = Color.Purple;
}
}