Измените borderColor TextBox

Как я могу изменить BorderColor текстового поля, когда пользователь нажимает на него или фокусируется на нем?

попробуй это

  bool focus = false; private void Form1_Paint(object sender, PaintEventArgs e) { if (focus) { textBox1.BorderStyle = BorderStyle.None; Pen p = new Pen(Color.Red); Graphics g = e.Graphics; int variance = 3; g.DrawRectangle(p, new Rectangle(textBox1.Location.X - variance, textBox1.Location.Y - variance, textBox1.Width + variance, textBox1.Height +variance )); } else { textBox1.BorderStyle = BorderStyle.FixedSingle; } } private void textBox1_Enter(object sender, EventArgs e) { focus = true; this.Refresh(); } private void textBox1_Leave(object sender, EventArgs e) { focus = false; this.Refresh(); } 

Вы можете обрабатывать сообщение WM_NCPAINT TextBox и нарисовать границу в области управления без клиента, если элемент управления имеет фокус. Вы можете использовать любой цвет для рисования границы:

 using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; public class ExTextBox : TextBox { [DllImport("user32")] private static extern IntPtr GetWindowDC(IntPtr hwnd); private const int WM_NCPAINT = 0x85; protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_NCPAINT && this.Focused) { var dc = GetWindowDC(Handle); using (Graphics g = Graphics.FromHdc(dc)) { g.DrawRectangle(Pens.Red, 0, 0, Width - 1, Height - 1); } } } } 

результат

Картина границ, в то время как управление сосредоточено, полностью не мерцает:

Изменение цвета рамки TextBox в фокусе

Заметка

На текущем посту я просто меняю цвет frameworks на фокус. Вы также можете добавить свойство BorderColor к BorderColor управления. Затем вы можете изменить цвет границы на основе вашего требования во время разработки или времени выполнения. Здесь я разместил более совершенную версию TextBox с свойством BorderColor :

Изменить цвет рамки текстового поля

Это окончательное решение для установки цвета frameworks TextBox:

 public class BorderedTextBox : UserControl { TextBox textBox; public BorderedTextBox() { textBox = new TextBox() { BorderStyle = BorderStyle.FixedSingle, Location = new Point(-1, -1), Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right }; Control container = new ContainerControl() { Dock = DockStyle.Fill, Padding = new Padding(-1) }; container.Controls.Add(textBox); this.Controls.Add(container); DefaultBorderColor = SystemColors.ControlDark; FocusedBorderColor = Color.Red; BackColor = DefaultBorderColor; Padding = new Padding(1); Size = textBox.Size; } public Color DefaultBorderColor { get; set; } public Color FocusedBorderColor { get; set; } public override string Text { get { return textBox.Text; } set { textBox.Text = value; } } protected override void OnEnter(EventArgs e) { BackColor = FocusedBorderColor; base.OnEnter(e); } protected override void OnLeave(EventArgs e) { BackColor = DefaultBorderColor; base.OnLeave(e); } protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { base.SetBoundsCore(x, y, width, textBox.PreferredHeight, specified); } } 

WinForms никогда не был хорош в этом, и это немного боль.

Один из способов, которым вы можете попробовать, – вставить TextBox в панель, а затем управлять рисунком на основе фокуса оттуда:

 public class BorderTextBox : Panel { private Color _NormalBorderColor = Color.Gray; private Color _FocusBorderColor = Color.Blue; public TextBox EditBox; public BorderTextBox() { this.DoubleBuffered = true; this.Padding = new Padding(2); EditBox = new TextBox(); EditBox.AutoSize = false; EditBox.BorderStyle = BorderStyle.None; EditBox.Dock = DockStyle.Fill; EditBox.Enter += new EventHandler(EditBox_Refresh); EditBox.Leave += new EventHandler(EditBox_Refresh); EditBox.Resize += new EventHandler(EditBox_Refresh); this.Controls.Add(EditBox); } private void EditBox_Refresh(object sender, EventArgs e) { this.Invalidate(); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.Clear(SystemColors.Window); using (Pen borderPen = new Pen(this.EditBox.Focused ? _FocusBorderColor : _NormalBorderColor)) { e.Graphics.DrawRectangle(borderPen, new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1)); } base.OnPaint(e); } } 

Использование OnPaint для рисования пользовательской границы ваших элементов управления отлично. Но знайте, как использовать OnPaint чтобы повысить эффективность и сократить время до минимума. Прочтите это, если вы испытываете laggy GUI при использовании пользовательских подпрограмм Paint: Каков правильный способ использования OnPaint в .Net-приложениях?

Потому что принятый ответ PraVn может показаться простым, но фактически неэффективным. Использование настраиваемого элемента управления, как и те, что указаны в ответах выше, намного лучше.

Возможно, производительность не является проблемой в вашем приложении, потому что она небольшая, но для более крупных приложений с множеством пользовательских подпрограмм OnPaint это неправильный подход, чтобы использовать способ, которым показал PraVn.

установите текстовое поле «Стиль frameworks» на «Нет», затем напишите этот код в контейнерную форму «красить» событие

 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); } 
Давайте будем гением компьютера.