【问题标题】:Changing the color of ComboBox's highlighter in C#在 C# 中更改 ComboBox 荧光笔的颜色
【发布时间】:2008-12-08 10:18:15
【问题描述】:

嘿。我对 ComboBox 中的荧光笔有疑问。最近我不得不将 ComboBox 中的某些项目变灰,我通过手动(以编程方式)在 ComboBox 中绘制字符串来做到这一点。在 DrawMode.NORMAL 下的 .NET 组合框中,当您单击箭头时,荧光笔将自动出现,并且荧光笔的背景色默认为近蓝色。问题是当我们将鼠标移到一个项目上时,悬停项目的前景色变为白色,但是当我们手动绘制项目时(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));
    }
}

【问题讨论】:

    标签: c# user-interface combobox


    【解决方案1】:

    默认情况下,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 对象而不释放它会导致资源泄漏。)

    【讨论】:

      【解决方案2】:

      是的。那真的很有帮助。我也尝试过:

      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));
      }
      

      这给了我我的期望。我肯定会考虑您关于使用系统画笔而不是实体画笔的建议。感谢您的解决方案。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-06-13
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 2011-05-06
          • 2016-06-08
          • 1970-01-01
          • 2014-10-11
          • 1970-01-01
          相关资源
          最近更新 更多