zoukankan      html  css  js  c++  java
  • 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);
        }
    
  • 相关阅读:
    direct path write 等待事件导致数据库hang
    Sql Server数据库视图的创建、修改
    MVC视图中Html.DropDownList()辅助方法的使用
    Ubuntu16.04下安装.NET Core
    Ubuntu16.04下部署golang开发环境
    win7环境下安装运行gotour【转载整理】
    一.Windows I/O模型之选择(select)模型
    Windos下的6种IO模型简要介绍
    编码介绍(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
    串口通信知识点详解
  • 原文地址:https://www.cnblogs.com/yincq/p/13626902.html
Copyright © 2011-2022 走看看