2012-03-19 7 views
17

Come posso modificare il BorderColor della casella di testo quando un utente fa clic su di esso o si concentra su di esso?Modificare il bordo Colore del riquadro di testo

+0

Se siete alla ricerca di un '' proprietà BorderColor' TextBox' avere, dare un'occhiata a [Cambia colore del bordo in TextBox] (http : //stackoverflow.com/a/39420512/3110834) –

risposta

12

provare questo

 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

grazie man, funziona, ma cambia anche il borderColor di tutte le altre caselle di testo nel Form, puoi spiegare come è successo e come rendere il colore rosso , è solo in blu !! –

+0

Non penso che il codice sopra cambierà il bordo di tutte le caselle di testo.Quello che stiamo facendo è disegnare un rettangolo attorno al textBox1 – PraveenVenu

+0

Come applicare diversi colori sul bordo o attorno al rettangolo –

9

Si tratta di una soluzione definitiva per impostare il colore del bordo di un controllo 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); 
    } 
} 
+0

Possiamo rendere multilinea questa casella di testo? –

5

WinForms mai stato bravo in questo ed è un po 'di dolore.

Un modo si può provare è grazie all'integrazione di un TextBox in un pannello e quindi gestire il disegno sulla base di messa a fuoco da lì:

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

Utilizzando OnPaint per disegnare un bordo personalizzato sui vostri controlli va bene. Ma sappi come usare OnPaint per aumentare l'efficienza e ridurre al minimo il tempo. Leggi questo se stai sperimentando una lenta GUI mentre usi le routine di pittura personalizzate: What is the right way to use OnPaint in .Net applications?

Perché la risposta accettata di PraVn può sembrare semplice, ma in realtà è inefficiente. Usando un controllo personalizzato, come quelli pubblicati nelle risposte sopra è molto meglio.

Forse la prestazione non è un problema nell'applicazione, perché è piccola, ma per le applicazioni più grandi con molte routine OnPaint personalizzate è un approccio sbagliato utilizzare il modo in cui PraVn ha mostrato.

0

set Stile bordo Casella di testo su Nessuno quindi scrivere questo codice in forma contenitore di eventi "dipingere"

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

È possibile gestire WM_NCPAINT messaggio di TextBox e disegnare un bordo sulla zona non-client di controllo, se il controllo è focalizzato. È possibile utilizzare qualsiasi colore per disegnare bordo:

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

Risultato

Il dipinto delle frontiere, mentre il controllo è focalizzato è completamente priva di sfarfallio:

Change TextBox border color on focus

Nota

Nel post corrente Ho appena cambiato il colore del bordo sulla messa a fuoco. È inoltre possibile aggiungere una proprietà BorderColor al controllo. Quindi puoi cambiare il colore del bordo in base ai tuoi requisiti in fase di progettazione o di esecuzione. Here Ho pubblicato una versione più completa di TextBox che ha BorderColor proprietà:

Change Textbox border color