(C#)Winform修改DateTimePicker控件的背景色

时间:2022-03-27 14:49:37
(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));
        }
}