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