Winfrom重绘ComboBox-DropDownList样式

原生winfrom的ComboBox 样式设置为DropDownList 样式固定,且大多数重绘多为重绘下拉选择框,此代码主要重绘ComboBox的边框 背景色等。

/// <summary>
/// 主要为DropDownList样式重绘(特定性较强)
/// </summary>
public partial class EVCombobox : ComboBox
{
    public EVCombobox()
    {
        InitializeComponent();
    }
    [DllImport("User32.dll")]
    public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

    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 = Win32API.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);
        }
    }
}
### 回答1: 在Winform中,要表格控件,可以使用以下方法: 1. 首先,确定要的表格控件,可以是DataGridView或ListView等任何支持表格展示的控件。 2. 创建一个继承自表格控件的自定义控件类,例如`CustomDataGridView`。 3. 在自定义控件类中,写`OnPaint`方法。在方法中编写自定义的制逻辑,例如制行列的边框、制单元格的背景色等。 4. 在`OnPaint`方法中,可以使用`Graphics`类来进行制操作。可以使用`e.Graphics`获取当前图对象,并在该对象上进行画操作。 5. 在需要表格的时候,调用自定义控件类的`Invalidate`方法,强制触发`OnPaint`方法进行。 6. 如果需要在表格控件的事件中进行,可以在事件处理程序中调用`Invalidate`方法。 例如,以下代码片段展示了一个简单的自定义DataGridView控件类: ```csharp public class CustomDataGridView : DataGridView { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 自定义制逻辑,例如制边框 Pen pen = new Pen(Color.Black); e.Graphics.DrawRectangle(pen, ClientRectangle); pen.Dispose(); } } ``` 然后,在使用表格控件的地方,可以使用自定义的控件类`CustomDataGridView`来代替原生的控件类,以实现的效果。 需要注意的是,表格控件会增加系统资源的使用,并可能影响界面的响应速度,因此应该避免过度的操作。 ### 回答2: 在WinForms中,要一个表格控件,可以按照以下步骤进行操作。 首先,需要创建一个继承自DataGridView的自定义控件。这个自定义控件将包含表格的所有定制逻辑。 然后,在自定义控件的构造函数中,可以设置表格的样式,如行高、列宽、表头等。 接着,可以写OnPaint方法,以便在控件制时自定义制表格的内容。在OnPaint方法中,可以使用Graphics对象的方法制表格的背景、行、列、单元格内容等。 此外,还可以写OnCellPainting方法,以便在每个单元格制时自定义制单元格的样式。在OnCellPainting方法中,可以使用Graphics对象的方法制单元格的边框、背景、内容等。 当需要更新表格的显示数据时,可以调用自定义控件的Refresh方法,强制制控件。在Refresh方法中,可以新计算表格的行数、列数、内容等,然后调用自定义控件的Invalidate方法,使控件无效,从而触发。 需要注意的是,在使用自定义控件时,需要将其添加到窗体或其他容器中,并设置好位置、大小等属性,才能正确显示和表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风干牛肉巴旦木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值