在TextBox C#中更改边框颜色

我有以下代码:

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); } } 

这是完美的,但它没有显示文本,直到它获得焦点。

有谁能够帮我? 怎么了?

预先感谢。

您还必须手动绘制文本。

 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没有给你想要的结果(我总是用这种方法得到更好的结果)。

要更改TextBox边框颜色,您可以覆盖WndProc方法并处理WM_NCPAINT消息。 然后使用GetWindowDC获取控件的窗口设备上下文,因为我们想要绘制到非客户端控件区域。 然后绘制,就足以从该上下文创建一个Graphics对象,然后绘制边框以进行控制。

若要在BorderColor属性更改时重绘控件,可以使用RedrawWindow方法。

这是一个具有BorderColor属性的TextBox 。 如果属性值与Color.Transparent不同,则控件使用BorderColor ,而BorderStyle是其默认值Fixed3d

 using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; 
 public class MyTextBox : TextBox { const int WM_NCPAINT = 0x85; const uint RDW_INVALIDATE = 0x1; const uint RDW_IUPDATENOW = 0x100; const uint RDW_FRAME = 0x400; [DllImport("user32.dll")] static extern IntPtr GetWindowDC(IntPtr hWnd); [DllImport("user32.dll")] static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("user32.dll")] static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprc, IntPtr hrgn, uint flags); Color borderColor = Color.Blue; public Color BorderColor { get { return borderColor; } set { borderColor = value; RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE); } } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_NCPAINT && BorderColor != Color.Transparent && BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D) { var hdc = GetWindowDC(this.Handle); using (var g = Graphics.FromHdcInternal(hdc)) using (var p = new Pen(BorderColor)) g.DrawRectangle(p, new Rectangle(0, 0, Width - 1, Height - 1)); ReleaseDC(this.Handle, hdc); } } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE); } } 

结果

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

在此处输入图像描述

下载

您可以克隆或下载工作示例:

  • 下载Zip
  • Github存储库

有几种方法可以做到这一点,没有一种方法是理想的。 这只是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边框,请将FocusedAlways属性设置为True

我希望这有帮助。

将文本框边框样式设置为无,然后将此代码写入容器窗体“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); }