Per modificare il colore del bordo di TextBox
è possibile ignorare WndProc
metodo e gestire WM_NCPAINT
messaggio. Quindi ottenere il contesto del dispositivo della finestra del controllo utilizzando GetWindowDC
perché vogliamo disegnare nell'area di controllo non client. Quindi, per disegnare, è sufficiente creare un oggetto Graphics
da quel contesto, quindi disegnare il bordo per il controllo.
Per ridisegnare il controllo quando si modifica la proprietà BorderColor
, è possibile utilizzare il metodo RedrawWindow
.
Codice
Ecco un TextBox
che ha una proprietà BorderColor
. Il controllo utilizza BorderColor
se i valori delle proprietà sono diversi da Color.Transparent
e BorderStyle
è il valore predefinito Fixed3d
.
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyTextBox : TextBox {
const int WM_NCPAINT = 0x85;
const uint RDW_INVALIDATE = 0x1;
const uint RDW_IUPDATENOW = 0x100;
const uint RDW_FRAME = 0x400;
[DllImport("user32.dll")]
static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprc, IntPtr hrgn, uint flags);
Color borderColor = Color.Blue;
public Color BorderColor {
get { return borderColor; }
set { borderColor = value;
RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero,
RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE);
}
}
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == WM_NCPAINT && BorderColor != Color.Transparent &&
BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D) {
var hdc = GetWindowDC(this.Handle);
using (var g = Graphics.FromHdcInternal(hdc))
using (var p = new Pen(BorderColor))
g.DrawRectangle(p, new Rectangle(0, 0, Width - 1, Height - 1));
ReleaseDC(this.Handle, hdc);
}
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero,
RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE);
}
}
Risultato
Ecco il risultato utilizzando diversi colori e diversi stati.Tutti gli stati di border-style è supportato come si può vedere nella immagine qui sotto ed è possibile utilizzare qualsiasi colore per il bordo:

fonte
2016-09-09 22:25:03
non si dovrebbe usare 'OnPaint' per il disegno di frontiera per' TextBox'. Invece dovresti gestire il messaggio 'WM_NCPAINT' in' WndProc' e disegnare il bordo nell'area non client, come [this] (http://stackoverflow.com/questions/17466067/change-border-color-in-textbox-c -sharp/39420512 # 39420512). –