zoukankan      html  css  js  c++  java
  • (C#)Winform修改DateTimePicker控件的背景色和边框色

    (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));
            }
    }
     
  • 相关阅读:
    ESB数据发布思路
    Mongo客户端MongoVUE的基本使用
    ESB数据采集思路
    css3学习笔记之按钮
    发布Qt程序时别忘了带上plugins(codecs等)
    [Qt]Cannot retrieve debugging output
    Linux下编译opencv库[转]
    OpenCV库Windows下QT编译及使用
    ipad4自动下载了ios8的安装包,好几个G啊,不想更新,怎么删了呢?
    VC: error LNK2019:unresolved external symbol *** referenced in function ***的解决方案
  • 原文地址:https://www.cnblogs.com/colder/p/2944703.html
Copyright © 2011-2022 走看看