在C#中更改ComboBox的荧光笔的颜色

时间:2008-12-08 10:18:15

标签: c# user-interface combobox

嘿。我在ComboBox中的荧光笔有问题。最近我不得不将ComboBox中的某些项目变灰,我通过在 ComboBox 中手动(按程序)绘制字符串来实现。在 DrawMode.NORMAL 下的.NET组合框中,当您单击箭头时,指示灯将自动出现,默认情况下,荧光笔的背景颜色将为kinna蓝色。问题是当我们将鼠标移动到项目上时,悬停项目的前景颜色变为白色,但是当我们手动绘制项目时( DrawMode.OwnerDrawVariable )它不起作用。你能帮我解决这个问题吗?

这就是我将项目变灰的方式,

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    int index = e.Index;
    CombinationEntry aFunction = comboBox1.Items[index] as CombinationEntry;  //CombinationEntry is a custom object to hold the gray info. Gray if not available and black if available
    if (aFunction.myIsAvailable)
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Black, new Point(e.Bounds.X, e.Bounds.Y));
    }
    else
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Gray, new Point(e.Bounds.X, e.Bounds.Y));
    }
}

3 个答案:

答案 0 :(得分:4)

默认情况下,ComboBox中的文本以两种颜色之一绘制:

SystemColors.WindowText

表示非突出显示的项目,或

SystemColors.HighlightText

突出显示的项目。

这些颜色不是固定的,但可以由用户配置(例如,通过控制面板)。在典型的Windows配色方案中,WindowText为黑色,HighlightText为白色,但如果已重新配置配色方案,情况并非总是如此。

无论用户如何配置系统,都要确保获得正确的颜色,并且要为突出显示的文本和非突出显示的文本获取适当的颜色,而不是使用Brushes.Black作为非禁用文本,使用类似的东西:

e.State == DrawItemState.Selected ?
    SystemBrushes.HighlightText : SystemBrushes.WindowText

这基本上说,如果你正在绘制的项目(e.State)的状态是Selected(突出显示),请使用SystemColors.HighlightText,否则使用SystemColors.WindowText。

您可能还想使用:

SystemBrushes.GrayText

而不是Brushes.Gray,如果用户具有非标准配色方案并且普通灰色看起来不正确。而且,你可能也应该使用:

comboBox1.Font

而不是创建Arial字体,以确保字体与窗体上为ComboBox定义的字体匹配。 (同时创建一个Font对象而不处理它会导致资源泄漏。)

答案 1 :(得分:0)

呀。这真的很有帮助。我还试着这样做:

if (e.State == ((DrawItemState.NoAccelerator | DrawItemState.NoFocusRect) | 
                (DrawItemState.Selected | 
                 DrawItemState.NoAccelerator | 
                 DrawItemState.NoFocusRect)))
{
    e.Graphics.DrawString(aFunction.ToString(), 
                          new Font("Arial", 10, FontStyle.Regular,
                                   GraphicsUnit.Pixel), 
                          SystemBrushes.HighlightText, 
                          new Point(e.Bounds.X, e.Bounds.Y));
}

这给了我我的预期。我绝对会考虑你使用系统画笔而不是实心画笔的建议。谢谢你的解决方案。

答案 2 :(得分:0)

if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)会比 e.State == DrawItemState.Selected或试图涵盖所有可能性