winforms 在TextBox C#中更改边框颜色

zz2j4svz  于 2022-11-17  发布在  C#
关注(0)|答案(4)|浏览(904)

下面的代码:

public class OurTextBox : TextBox
{
    public OurTextBox()
        : base()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
         base.OnPaint(e);
         Pen penBorder = new Pen(Color.Gray, 1);
         Rectangle rectBorder = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
         e.Graphics.DrawRectangle(penBorder, rectBorder);
   }
}

这是完美的工作,但它不显示文本,直到它获得焦点。
有人能帮帮我吗?怎么了?

ej83mcc0

ej83mcc01#

要更改TextBox的边框颜色,您可以重写WndProc方法并处理WM_NCPAINT消息。然后使用GetWindowDC获取控件的窗口设备上下文,因为我们要绘制到控件的非工作区。然后要绘制,从该上下文创建一个Graphics对象就足够了,然后为控件绘制边框。
若要在BorderColor属性变更时重新绘制控件,您可以使用RedrawWindow方法。

代码

下面是一个具有BorderColor属性的TextBox。如果该属性值与Color.Transparent不同,并且BorderStyle是其默认值Fixed3d,则该控件使用BorderColor
第一个

结果

以下是使用不同颜色和不同状态的结果。如下图所示,支持所有状态的边框样式,您可以使用任何颜色的边框:

下载

您可以复制或下载工作示例:

cig3rfwq

cig3rfwq2#

您还必须手动绘制文本。

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Pen penBorder = new Pen(Color.Gray, 1);
    Rectangle rectBorder = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
    e.Graphics.DrawRectangle(penBorder, rectBorder);

    Rectangle textRec = new Rectangle(e.ClipRectangle.X + 1, e.ClipRectangle.Y + 1, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
    TextRenderer.DrawText(e.Graphics, Text, this.Font, textRec, this.ForeColor, this.BackColor, TextFormatFlags.Default);
}

或者,你可以尝试使用e.Graphics.DrawString()方法,如果TextRenderer没有给你想要的结果(我总是有更好的结果与这种方法thou).

hfsqlsce

hfsqlsce3#

有几种方法可以做到这一点,但没有一种是理想的。这只是WinForms的本质。然而,你有一些选择。我将总结如下:
实现所需目的的一种方法是在Panel中嵌入TextBox,如下所示。

public class BorderedTextBox : Panel 
{
    private TextBox textBox;
    private bool focusedAlways = false;
    private Color normalBorderColor = Color.Gray;
    private Color focusedBorderColor = Color.Red;

    public BorderTextBox() 
    {
        this.DoubleBuffered = true;
        this.Padding = new Padding(2);

        this.TextBox = new TextBox();
        this.TextBox.AutoSize = false;
        this.TextBox.BorderStyle = BorderStyle.None;
        this.TextBox.Dock = DockStyle.Fill;
        this.TextBox.Enter += new EventHandler(this.TextBox_Refresh);
        this.TextBox.Leave += new EventHandler(this.TextBox_Refresh);
        this.TextBox.Resize += new EventHandler(this.TextBox_Refresh);
        this.Controls.Add(this.TextBox);
    }

    private void TextBox_Refresh(object sender, EventArgs e) 
    {
        this.Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) 
    {
        e.Graphics.Clear(SystemColors.Window);
        using (Pen borderPen = new Pen(this.TextBox.Focused || FocusedAlways ? 
            focusedBorderColor : normalBorderColor)) 
        {
            e.Graphics.DrawRectangle(borderPen, 
                new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1));
        }
        base.OnPaint(e);
    }

    public TextBox TextBox
    {
        get { return textbox; }
        set { textbox = value; }
    }

    public bool FocusedAlaways
    {
        get { return focusedAlways; }
        set { focusedAlways = value; }
    }
}

您也可以在不覆写任何控件的情况下执行此动作,但上述方法会更好。当控件取得焦点时,上述方法会绘制边框。如果您想要永久显示边框,请将FocusedAlways属性设定为True
我希望这能帮上忙。

6yjfywim

6yjfywim4#

将文本框边框样式设置为None,然后将此代码写入容器窗体“paint”事件

private void Form1_Paint(object sender, PaintEventArgs e)
        {
System.Drawing.Rectangle rect = new Rectangle(TextBox1.Location.X, TextBox1.Location.Y, TextBox1.ClientSize.Width, TextBox1.ClientSize.Height);

                rect.Inflate(1, 1); // border thickness
                System.Windows.Forms.ControlPaint.DrawBorder(e.Graphics, rect, Color.DeepSkyBlue, ButtonBorderStyle.Solid);

}

相关问题