更改ComboBox突出显示的颜色

时间:2012-11-03 18:27:58

标签: c# winforms combobox highlighting

我正在尝试在C#ComboBox应用程序的Windows Forms下拉列表中更改突出显示的颜色。 我在整个网页上搜索了一个答案,到目前为止我找到的最佳选项是在绘制所选项目时绘制所需颜色的矩形。

Class Search
{
    Public Search()
    {
    }

    private void addFilter()
    {
        ComboBox field = new ComboBox();

        field.Items.AddRange(new string[] { "Item1", "item2" });
        field.Text = "Item1";
        field.DropDownStyle = ComboBoxStyle.DropDownList;
        field.FlatStyle = FlatStyle.Flat;
        field.BackColor = Color.FromArgb(235, 235, 235);
        field.DrawMode = DrawMode.OwnerDrawFixed;
        field.DrawItem += field_DrawItem;
    }

    private void field_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index >= 0)
        {
            ComboBox combo = sender as ComboBox;

            if (e.Index == combo.SelectedIndex)
                e.Graphics.FillRectangle(new SolidBrush(Color.Gray),
                                         e.Bounds
                                        );
            else
                e.Graphics.FillRectangle(new SolidBrush(combo.BackColor),
                                         e.Bounds
                                        );

            e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font,
                                  new SolidBrush(combo.ForeColor),
                                  new Point(e.Bounds.X, e.Bounds.Y)
                                 );
        }
    }
}

此代码的问题在于,一旦选择了下拉列表中的另一个项目,我绘制矩形的另一个项目仍然是我想要突出显示的颜色。 然后我试图保存最后绘制的项目并重绘它:

Class Search
{
    private DrawItemEventArgs lastDrawn;

    Public Search()
    {
        lastDrawn = null;
    }

    private void addFilter()
    {
        ComboBox field = new ComboBox();

        field.Items.AddRange(new string[] { "Item1", "item2" });
        field.Text = "Item1";
        field.DropDownStyle = ComboBoxStyle.DropDownList;
        field.FlatStyle = FlatStyle.Flat;
        field.BackColor = Color.FromArgb(235, 235, 235);
        field.DrawMode = DrawMode.OwnerDrawFixed;
        field.DrawItem += field_DrawItem;
    }

    private void field_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index >= 0)
        {
            ComboBox combo = sender as ComboBox;
            if (e.Index == combo.SelectedIndex)
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.Gray), e.Bounds);
                if(lastDrawn != null)
                    lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor),
                                                 lastDrawn.Bounds
                                                );
                lastDrawn = e;
            }
            else
                e.Graphics.FillRectangle(new SolidBrush(combo.BackColor),
                                         e.Bounds
                                        );

            e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font,
                                  new SolidBrush(combo.ForeColor),
                                  new Point(e.Bounds.X, e.Bounds.Y)
                                 );
        }
    }
}

由于lastDrawn.Bounds(不兼容类型)

,此行返回错误
lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor),
                                                 lastDrawn.Bounds
                                                );

我觉得改变下拉菜单的高亮颜色是不可能的。 提前谢谢!

1 个答案:

答案 0 :(得分:21)

如果您在项目中的多个位置使用ComboBox,那么一遍又一遍地重复DrawItem事件的相同代码是没有意义的。只需将此类添加到项目中,您将拥有一个具有HightlightColor属性的新ComboBox控件,这将使整个项目中的控件更容易使用:

class AdvancedComboBox : ComboBox
{
    new public System.Windows.Forms.DrawMode DrawMode { get; set; }
    public Color HighlightColor { get; set; }

    public AdvancedComboBox()
    {
        base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
        this.HighlightColor = Color.Gray;
        this.DrawItem += new DrawItemEventHandler(AdvancedComboBox_DrawItem);
    }

    void AdvancedComboBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index < 0)
            return;

        ComboBox combo = sender as ComboBox;
        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
            e.Graphics.FillRectangle(new SolidBrush(HighlightColor),
                                     e.Bounds);
        else
            e.Graphics.FillRectangle(new SolidBrush(combo.BackColor),
                                     e.Bounds);

        e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font,
                              new SolidBrush(combo.ForeColor),
                              new Point(e.Bounds.X, e.Bounds.Y));

        e.DrawFocusRectangle();
    }
}