• WinForm重绘Combobox控件无边框样式


    起因

    其他文章大多介绍combobox控件下拉框的重绘,现在主要用途就是重绘DropDownList样式下的Combobox控件,使BackColor属性有效。

    代码如下:

    /// <summary>
        /// 主要为DropDownList样式重绘(特定性较强)
        /// </summary>
        public partial class ComboboxEx : ComboBox
        {
            public ComboboxEx()
            {
                InitializeComponent();
                this.DropDownStyle = ComboBoxStyle.DropDownList
            }
    
            public Color BoardColor { get; set; } = Color.White;
    
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                //WM_PAINT = 0xf; 要求一个窗口重画自己,即Paint事件时
                //WM_CTLCOLOREDIT = 0x133;当一个编辑型控件将要被绘制时发送此消息给它的父窗口;
                //通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
                //windows消息值表,可参考:
                if (m.Msg == 0xf || m.Msg == 0x133)
                {
                    IntPtr hDC = GetWindowDC(m.HWnd);
                    if (hDC.ToInt32() == 0) //如果取设备上下文失败则返回
                    {
                        return;
                    }
    
                    //建立Graphics对像
                    Graphics g = Graphics.FromHdc(hDC);
                    g.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, 0, Width, Height));
                    //画边框的
                    //ControlPaint.DrawBorder(g, new Rectangle(0, 0, Width, Height), BoardColor, ButtonBorderStyle.Solid);
                    //画坚线
                    //ControlPaint.DrawBorder(g, new Rectangle(Width - Height, 0, Height, Height), Color.Red, ButtonBorderStyle.Solid);
    
                    Point pA = new Point(Width - 20, Height / 2 - 3);
                    Point pB = pA + new Size(6, 6);
                    Point pC = pA + new Size(12, 0);
                    g.DrawLine(new Pen(Color.White,2), pA, pB);
                    g.DrawLine(new Pen(Color.White,2), pB, pC);
    
                    if (this.SelectedIndex > -1)
                    {
                        string text = SelectedItem.ToString();
                        Size strSize = Size.Ceiling(g.MeasureString(text, this.Font));
                        g.DrawString(text, Font, new SolidBrush(ForeColor), 5, (Height - strSize.Height) / 2);
                    }
    
                    //g.DrawLine(new Pen(Brushes.Blue, 2), new PointF(this.Width - this.Height, 0), new PointF(this.Width - this.Height, this.Height));
                    //释放DC 
                    ReleaseDC(m.HWnd, hDC);
                }
            }
            
            [DllImport("User32.dll")]
            public static extern IntPtr GetWindowDC(IntPtr hwnd);
    
            [DllImport("User32.dll")]
            public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
        }
    
  • 相关阅读:
    [JAVA]Java下XML的解析
    [短彩信]C#短彩信模块开发设计(4)——其他
    [短彩信]C#短彩信模块开发设计(3)——协议
    入住博客园了~
    【Oyster轻量框架】C# ORM 较灵活的轻量数据模型
    C# Oracle 之Insert 与 Update 的封装
    用WORD发布博客测试~
    C#自带的.net类库获得主机名和IP
    百万本书籍视频资料免费送
    教你使用ECode破解E语言crackme视频教程
  • 原文地址:https://www.cnblogs.com/yincq/p/13626902.html
Copyright © 2020-2023  润新知