2012-03-19 19 views
17

Jak mogę zmienić Kolor obramowania pola tekstowego, gdy użytkownik kliknie lub ustawi na nim ostrość?Zmień kolor obramowania Koloru TextBox

+0

Jeśli szukasz '' TextBox' mającego własności BorderColor', przyjrzeć się [zmiana koloru granicznego w TextBox] (http : //stackoverflow.com/a/39420512/3110834) –

Odpowiedz

12

spróbować

 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

dziękuje człowiekowi, to działa, ale zmienia również borderColor wszystkich innych pól tekstowych w Formie też, czy możesz wyjaśnić, jak to się stało i jak zrobić kolor czerwony , tylko w kolorze niebieskim !! –

+0

Nie sądzę, aby powyższy kod zmienił granicę wszystkich pól tekstowych.Co robimy, narysujemy prostokąt wokół textBox1 – PraveenVenu

+0

Jak zastosować różne kolory na granicy lub wokół prostokąta –

9

Jest to doskonałe rozwiązanie, aby ustawić kolor obramowania 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

Czy możemy utworzyć ten tekst wielowierszowy? –

5

WinForms nigdy nie był w tym dobry i jest to trochę uciążliwe.

Jednym ze sposobów można spróbować to osadzając TextBox w panelu, a następnie zarządzać rysunek na podstawie ostrości stamtąd:

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

Korzystanie OnPaint narysować obramowanie niestandardowe na swoich kontroli jest w porządku. Ale wiesz, jak używać OnPaint, aby utrzymać efektywność i zredukować czas do minimum. Przeczytaj to, jeśli masz opóźnione GUI podczas używania niestandardowych procedur malowania: What is the right way to use OnPaint in .Net applications?

Ponieważ zaakceptowana odpowiedź PraVn może wydawać się prosta, ale w rzeczywistości jest nieefektywna. Używanie niestandardowych formantów, takich jak te zamieszczone w powyższych odpowiedziach, jest o wiele lepsze.

Może wydajność nie jest problemem w twojej aplikacji, ponieważ jest mała, ale w przypadku większych aplikacji z wieloma niestandardowymi procedurami OnPaint jest to niewłaściwe podejście do korzystania ze sposobu, w jaki pokazano PraVn.

0

zestaw Ramka Granicy styl Żaden następnie napisać ten kod do postaci pojemnika „farba” wydarzenie

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

można obsługiwać WM_NCPAINT wiadomość z TextBox i narysować obramowanie na obszarze non-klient kontroli, jeżeli kontrola ma ostrość. Można użyć dowolnego koloru zwrócić border:

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

Wynik

Obraz granic podczas kontroli koncentruje się całkowicie migotania:

Change TextBox border color on focus

Uwaga

W bieżącym wpisie Po prostu zmieniam kolor obramowania przy fokusie. Możesz również dodać właściwość BorderColor do formantu. Następnie możesz zmienić kolor obramowania w zależności od wymagań w czasie projektowania lub w czasie wykonywania. Here Zamieściłem wersję bardziej wypełniony od TextBox który ma BorderColor właściwość:

Change Textbox border color