代码之家  ›  专栏  ›  技术社区  ›  Carles

在自定义.NET组合框上模拟系统样式

  •  0
  • Carles  · 技术社区  · 6 年前

    我派生了combobox类,以便拥有列表项的自定义布局。这是一个下拉列表样式组合框,它有一个很好的外观,而自定义的看起来像一个旧的样式。

    Custom Combobox vs Default

    是否有任何方法可以模拟或强制控件在仍具有自定义设计的情况下绘制“windows默认样式”布局?这是一种类似于上面图片中右边的样式,带有渐变背景(或者根据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 回复  |  直到 6 年前
        1
  •  0
  •   Carles    6 年前

    我在网上找不到关于这个的信息,所以我想不可能使用系统默认样式自动绘制背景。

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

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