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
risposta
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();
}
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 !! –
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
Come applicare diversi colori sul bordo o attorno al rettangolo –
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);
}
}
Possiamo rendere multilinea questa casella di testo? –
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);
}
}
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.
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);
}
È 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:
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à:
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) –