2012-03-19 29 views
17

Làm cách nào để thay đổi BorderColor của Textbox khi người dùng Click vào nó hoặc tập trung vào nó?Thay đổi borderColor của TextBox

+0

Nếu bạn đang tìm kiếm một 'TextBox' có' sở hữu BorderColor', hãy nhìn vào [color biên giới Thay đổi trong TextBox] (http : //stackoverflow.com/a/39420512/3110834) –

Trả lời

12

thử này

 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

cảm ơn người đàn ông, nó hoạt động, nhưng nó cũng thay đổi borderColor của tất cả các hộp văn bản khác trong Form quá, bạn có thể giải thích làm thế nào nó xảy ra và làm thế nào để làm cho màu đỏ , nó chỉ ở Blue !! –

+0

Tôi không nghĩ rằng mã trên sẽ thay đổi đường viền của tất cả các hộp văn bản.Những gì chúng tôi đang làm là, chúng tôi vẽ một hình chữ nhật xung quanh textBox1 – PraveenVenu

+0

Làm thế nào để áp dụng màu sắc khác nhau trên biên giới, hoặc xung quanh hình chữ nhật –

9

Đây là một giải pháp cuối cùng để thiết lập màu viền của một 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

Chúng ta có thể tạo ra multiline textbox này không? –

5

WinForms chưa bao giờ giỏi trong việc này và đó là một chút đau đớn.

Một cách để bạn có thể thử là bằng cách nhúng một TextBox trong một Panel và sau đó quản lý các bản vẽ dựa trên tập trung từ đó:

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

Sử dụng OnPaint để vẽ một biên giới tùy chỉnh trên điều khiển của bạn là tốt. Nhưng biết cách sử dụng OnPaint để duy trì hiệu quả và giảm thời gian tối thiểu. Hãy đọc điều này nếu bạn đang gặp phải giao diện đồ họa trong khi sử dụng các thói quen sơn tùy chỉnh: What is the right way to use OnPaint in .Net applications?

Vì câu trả lời được chấp nhận của PraVn có vẻ đơn giản nhưng thực sự không hiệu quả. Sử dụng một điều khiển tùy chỉnh, giống như những người được đăng trong các câu trả lời ở trên là cách tốt hơn.

Có lẽ hiệu suất không phải là một vấn đề trong ứng dụng của bạn, vì nó nhỏ, nhưng đối với các ứng dụng lớn hơn với nhiều thói quen OnPaint tùy chỉnh, đó là cách tiếp cận sai để sử dụng cách PraVn hiển thị.

0

bộ hộp chữ Border phong cách tới Không sau đó viết mã này vào dạng container "sơn" sự kiện

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

Bạn có thể xử lý WM_NCPAINT điệp của TextBox và vẽ một biên giới trên khu vực phi-client tầm kiểm soát nếu kiểm soát đã tập trung. Bạn có thể sử dụng bất kỳ màu nào để vẽ biên giới:

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

quả

Bức tranh biên giới trong khi điều khiển được tập trung là hoàn toàn không lập lòe:

Change TextBox border color on focus

Note

Trong bài đăng hiện tại Tôi chỉ thay đổi màu đường viền trên tiêu điểm. Bạn cũng có thể thêm thuộc tính BorderColor vào điều khiển. Sau đó, bạn có thể thay đổi màu đường viền dựa trên yêu cầu của bạn tại thời gian thiết kế hoặc thời gian chạy. Here tôi đăng tải một phiên bản hoàn thành hơn TextBox trong đó có BorderColor tài sản:

Change Textbox border color

Các vấn đề liên quan