改变WinForms ComboBox的选择颜色

4

大家好,我已经仔细查看了,但似乎找不到我要的东西。我想改变ComboBoc控件的选择颜色(最好不用子类化控件)。我尝试了以下代码,但是这个事件甚至没有触发:

private void comboBoxDb_DrawItem(object sender, DrawItemEventArgs e) 
{
    ComboBox combo = sender as ComboBox;
    e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), e.Bounds);
    string strSelectionColor = @"#99D4FC";
    Color selectionColor = 
        System.Drawing.ColorTranslator.FromHtml(strSelectionColor);
    e.Graphics.DrawString(combo.Items[e.Index].ToString(), 
                          e.Font, 
                          new SolidBrush(selectionColor), 
                          new Point(e.Bounds.X, e.Bounds.Y));
}

但是这个事件甚至没有触发。我在这里做错了什么?
谢谢您的时间。
编辑。虽然非触发是由于没有正确设置ComboBox的DrawMode属性所致,正如@Teppic指出的那样,但这仍然不能满足我的要求。我想设置选择颜色,我上面所做的(我已经在这里屏蔽了名称)确实可以做到。
而我想改变控件中的蓝色高亮显示,如下所示。
请输入图片描述

所以,问题是事件没有触发?你尝试在另一个事件上运行代码了吗? - chaliasos
我还没有解决上述问题,主要是因为其中使用了 DrawItemEventArg。我不熟悉其他使用此事件参数的事件。虽然事件已正确连接,但似乎在选择新索引时并未触发。感谢您的时间。 - MoonKnight
如果事件在正常情况下触发,但在选择的项目更改时没有触发,那么使用另一个事件如何?该事件在项目更改时触发,然后使项目失效,以便调用绘制项目? - Hinek
我认为我可能需要覆盖/子类化该控件。但在这种情况下,我没有ComboBoxes的经验,所以对此方面的任何帮助将不胜感激。 - MoonKnight
2个回答

17

将ComboBox控件的DrawMode属性设置为OwnerDrawFixed(如果每个项目的高度相同)或OwnerDrawVariable(如果每个项目的高度可能不同)。

然后修改您的DrawItem事件,例如以下代码(显然要替换成您自己的颜色):

private void comboBoxDb_DrawItem(object sender, DrawItemEventArgs e) 
{
    var combo = sender as ComboBox;

    if((e.State & DrawItemState.Selected) == DrawItemState.Selected)
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.BlueViolet), e.Bounds);
    }
    else
    {
        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window), e.Bounds);
    }

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

非常感谢!请解释一下这一行的含义:if((e.State & DrawItemState.Selected) == DrawItemState.Selected) - Ali Ashraf
e.State 可以同时表示多个 DrawItemState 值。'if((e.state & DrawItemState.Selected) == DrawItemState.Selected)' 是一种检查其中一个值是否为 DrawItemState.Selected 的方法。详细解释请参见 https://dev59.com/i3VD5IYBdhLWcg3wWKPc#8480。 - Teppic

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接