如何在编辑模式下设置自定义文本框中的对齐方式和字体

问题描述 投票:0回答:1

自定义文本框在非编辑模式下按预期显示文本,如何在编辑模式下显示垂直居中、字体相同且不重叠的文本?

文本框必须允许设置高度而不影响字体大小,反之亦然

enter image description here

我的自定义文本框代码:

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);
    }
}
c# winforms textbox custom-controls
1个回答
0
投票

由于更改 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.