2012-03-19 1 views
17

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

+0

Если вы ищете '' TextBox', имеющего собственности BorderColor', взглянуть на [Изменить цвет границы в TextBox] (HTTP : //stackoverflow.com/a/39420512/3110834) –

ответ

12

попробовать это

 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(); 
     } 
+0

спасибо человеку, он работает, но он также меняет borderColor всех других текстовых полей в форме тоже. Можете ли вы объяснить, как это произошло и как сделать цвет красным , его только в синем! –

+0

Я не думаю, что приведенный выше код изменит границу всех текстовых полей.Что мы делаем, мы рисуем прямоугольник вокруг textBox1 – PraveenVenu

+0

Как применять разные цвета на границе или вокруг Rectangle –

9

Это окончательное решение, чтобы установить цвет границы текстового поля:

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

Можем ли мы сделать это текстовое поле многострочным? –

5

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

Использование OnPaint нарисовать пользовательскую границу элементов управления в порядке. Но знайте, как использовать OnPaint, чтобы повысить эффективность и сократить время до минимума. Прочтите это, если вы испытываете лагирующий графический интерфейс при использовании пользовательских подпрограмм: What is the right way to use OnPaint in .Net applications?

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

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

0

набор стилей Текстовое поле Border к None затем записать этот код в виде контейнера «краска» событие

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

} 
17

Вы можете обрабатывать 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); 
      } 
     } 
    } 
} 

Результат

Картина границ, а контроль сфокусирован полностью немерцающий:

Change TextBox border color on focus

Примечание

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

Change Textbox border color

Смежные вопросы