在自定义.NET Combobox上模拟系统样式

时间:2018-11-29 14:19:46

标签: c# winforms custom-controls

我已经派生了ComboBox类,以便具有列表项的自定义布局。这是一个Dropdown列表样式的Combobox,具有漂亮的外观,而自定义样式则类似于旧样式​​。

Custom Combobox vs Default

在仍然具有自定义设计的情况下,是否可以模拟或强制控件绘制“ Windows默认样式”布局?这是一种具有与上图右图类似的样式,带有渐变背景(或根据窗口版本而定)。

这是我到目前为止所做的:

    public ComboBoxRGB()
    {
        this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
        this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
    }

    protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
    {
        base.OnDrawItem(e);

        if (Items.Count > 0)
        {
            if (e.Index > -1)
            {
                if (Items[e.Index] == null) return;

                int BarWidth = 16;
                int BarSpacing = 1;
                int Spacing_Top = 2;
                int Spacing_Left = 3;
                int Spacing_Right = 4;

                ComboBoxRGBItem item;
                try
                {
                    item = (ComboBoxRGBItem)Items[e.Index];
                }
                catch { return; }

                e.DrawBackground();
                e.DrawFocusRectangle();

                //Draw color indicator
                System.Drawing.SolidBrush bColor = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(item.Red, item.Green, item.Blue));
                e.Graphics.FillRectangle(bColor, Spacing_Left + e.Bounds.Left, e.Bounds.Top + Spacing_Top, 12, 12);

                //Draw text
                System.Drawing.SolidBrush sbText = (e.State == System.Windows.Forms.DrawItemState.Selected) ? new System.Drawing.SolidBrush(System.Drawing.Color.White) : new System.Drawing.SolidBrush(System.Drawing.Color.Black);
                e.Graphics.DrawString(item.Text, e.Font, sbText, Spacing_Left + e.Bounds.Left + BarWidth + Spacing_Right, e.Bounds.Top);

            } //IF_Index
        } //IF_Items_Count
    }

如果有人对此有任何想法,我将感到非常高兴。我想尝试手动模拟外观,因为这会随Windows版本的变化而变化。

1 个答案:

答案 0 :(得分:0)

我无法在Internet上找到有关此信息,因此我想不可能使用系统默认样式自动绘制背景。

目前,解决方案是通过重写Paint方法完全手动绘制它,但这需要考虑正在执行的Windows版本,并使用不同的设计绘制控件。

>

如果有人有不同的解决方案或建议,请告诉我。