(C#)Winform修改DateTimePicker控件的背景色Winform中日期控件DateTimePicker默認是不能修改背景色和邊框色的,如果想要改變它的背景色和邊框色
那也是有辦法的,只需要繼承DateTimePicker做一個自定義控件,再重寫WndProc方法。此外還要重寫屬性,這樣就可以在外部修改它的顏色了。 自定義控件的完整代碼如下:
public class UCDateTime : DateTimePicker
{
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, object lParam);
[DllImport("user32")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
const int WM_ERASEBKGND = 0x14;
const int WM_NC_PAINT = 0x85;
const int WM_PAINT = 0xF;
const int WM_PRINTCLIENT = 0x318;
//邊框顏色
private Pen BorderPen = new Pen(SystemColors.ControlDark, 2);
/// <summary>
/// 定義背景色私有變量
/// </summary>
private Color _backColor = Color.White;
/// <summary>
/// 定義背景色屬性
/// </summary>
public override Color BackColor
{
get
{
return _backColor;
}
set
{
_backColor = value;
}
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
IntPtr hDC = IntPtr.Zero;
Graphics gdc = null;
switch (m.Msg)
{
//畫背景色
case WM_ERASEBKGND:
gdc = Graphics.FromHdc(m.WParam);
gdc.FillRectangle(new SolidBrush(_backColor), new Rectangle(0, 0, this.Width, this.Height));
gdc.Dispose();
break;
case WM_NC_PAINT:
hDC = GetWindowDC(m.HWnd);
gdc = Graphics.FromHdc(hDC);
SendMessage(this.Handle, WM_ERASEBKGND, hDC, 0);
SendPrintClientMsg();
SendMessage(this.Handle, WM_PAINT, IntPtr.Zero, 0);
m.Result = (IntPtr)1; // indicate msg has been processed
ReleaseDC(m.HWnd, hDC);
gdc.Dispose();
break;
//畫邊框
case WM_PAINT:
base.WndProc(ref m);
hDC = GetWindowDC(m.HWnd);
gdc = Graphics.FromHdc(hDC);
OverrideControlBorder(gdc);
ReleaseDC(m.HWnd, hDC);
gdc.Dispose();
break;
default:
base.WndProc(ref m);
break;
}
}
private void SendPrintClientMsg()
{
// We send this message for the control to redraw the client area
Graphics gClient = this.CreateGraphics();
IntPtr ptrClientDC = gClient.GetHdc();
SendMessage(this.Handle, WM_PRINTCLIENT, ptrClientDC, 0);
gClient.ReleaseHdc(ptrClientDC);
gClient.Dispose();
}
private void OverrideControlBorder(Graphics g)
{
g.DrawRectangle(BorderPen, new Rectangle(0, 0, this.Width, this.Height));
}
}