2012-03-19 17 views
17

¿Cómo puedo cambiar el BorderColor del cuadro de texto cuando un usuario hace clic en él o se enfoca en él?Cambiar el borderColor del cuadro de texto

+0

Si usted está buscando un '' TextBox' tener la propiedad BorderColor', echar un vistazo a [color del borde Cambio en el cuadro de texto] (http : //stackoverflow.com/a/39420512/3110834) –

Respuesta

12

probar esto

 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

gracias, funciona, pero también cambia el borderColor de todos los demás cuadros de texto del formulario. ¿Puede explicar cómo sucedió y cómo hacer que el color sea rojo? , solo en azul !! –

+0

No creo que el código anterior cambie el borde de todos los cuadros de texto.Lo que estamos haciendo es dibujar un rectángulo alrededor de textBox1 – PraveenVenu

+0

Cómo aplicar diferentes colores en el borde, o alrededor del rectángulo –

9

Esta es una solución definitiva para establecer el color del borde de un cuadro de texto:

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

¿Podemos hacer este cuadro de texto multilínea? –

5

WinForms nunca fue bueno en esto y es un poco de dolor.

Una forma que puede probar es mediante la incorporación de un cuadro de texto en un panel y luego administrar el dibujo basado en el enfoque de allí:

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

Usando OnPaint para dibujar un borde personalizado en sus controles está muy bien. Pero sepa cómo usar OnPaint para mantener la eficiencia y reducir el tiempo al mínimo. Lea esto si experimenta una GUI lenta al usar rutinas de pintura personalizadas: What is the right way to use OnPaint in .Net applications?

Porque la respuesta aceptada de PraVn puede parecer simple, pero en realidad es ineficiente. Usar un control personalizado, como los publicados en las respuestas anteriores, es mucho mejor.

Tal vez el rendimiento no sea un problema en su aplicación, porque es pequeño, pero para aplicaciones más grandes con muchas rutinas OnPaint personalizadas, es un enfoque incorrecto utilizar el modo que mostró PraVn.

0

sistema del estilo del cuadro de texto Borde en Ninguno luego escribir el código a la forma de contenedores evento "pintura"

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

Puede manejar WM_NCPAINT mensaje de TextBox y trazar una frontera en el área no cliente de control si el control tiene foco. Se puede usar cualquier color para dibujar la frontera:

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

Resultado

La pintura de las fronteras mientras que el control se centra es completamente libre de parpadeo:

Change TextBox border color on focus

Nota

En la publicación actual Solo cambio el color del borde en el foco. También puede agregar una propiedad BorderColor al control. Luego puede cambiar el color del borde en función de sus necesidades en tiempo de diseño o tiempo de ejecución. Me Here publicado una versión más completa de TextBox que tiene BorderColor propiedad:

Change Textbox border color

Cuestiones relacionadas