【问题标题】:How to change combobox background color (not just the drop down list part)如何更改组合框背景颜色(不仅仅是下拉列表部分)
【发布时间】:2011-06-24 12:49:36
【问题描述】:

在 Windows 7 上运行的 winform 应用程序中,我希望更改组合框的背景颜色以突出显示它。 组合框的 DropDownStyle 为 DropDownList。

当我以编程方式将 BackColor 属性更改为红色时,只有实际下拉列表的背景更改为红色。当下拉列表未打开时,显示所选值的组合框背景保持灰色。我该怎么做才能让它也变成红色?

当应用在 Windows XP 上运行时,设置 BackColor 属性可以正常工作

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    这应该让你开始。

    将组合框DrawMode属性改为OwnerDrawFixed,并处理DrawItem事件:

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        int index = e.Index >= 0 ? e.Index : 0;
        var brush = Brushes.Black;
        e.DrawBackground();
        e.Graphics.DrawString(comboBox1.Items[index].ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }
    

    背景颜色会正确,但盒子的样式会是扁平的,而不是通常的 3D 样式。

    【讨论】:

    • 谢谢,这是一个好的开始。有谁知道如何更改背景颜色并保留 3D 样式?
    • 非常有帮助!谢谢你。我必须添加... if (e.Index == -1) return; --- 因为我在加载时收到“System.ArgumentOutOfRangeException”。此外,在聚焦时更改背景颜色会很好。
    【解决方案2】:

    由于 Igby Largeman 的解决方案无论如何都会失去 3D 效果,因此最好将 FlatStyle 属性更改为 Flat。即使在 Windows 7 中,背景颜色似乎也是如此,并且无需重新实现任何低级事件。

    我认为这是微软的一个错误......

    【讨论】:

    • 这会导致外观非常不同,还会导致一些令人讨厌的闪烁伪影。
    • 它在 Windows Server 2012 R2 上给了我问题。同样在 Windows Server 2008 上运行良好。将 FlatStyle 更改为 Flat 可以。你在一个非常关键的时刻拯救了我。
    【解决方案3】:

    我玩了一段时间,不想做任何涉及太多的事情。以上这些想法可能有效,但我所做的只是将 flatStyle 属性从“标准”更改为“平面”。

    虽然不完美,但至少将灰色/禁用的背景变为白色。

    你可以在这里看到比较:

    加热源 #1 > DropdownList > flat(下拉列表后的最终决定是允许用户输入错误数据)

    Heater Source #2 > Dropdown > Standard(默认的看起来不错)

    房屋类型 > 下拉菜单 > 平房

    Heating Source #1 Vendor > DropdownList > Standard(默认为禁用灰色)

    【讨论】:

    • 我的表单背景颜色是白色,当我将 FlatStyle 设置为 Flat 时,我真的不喜欢 Combobox 刚刚融入背景的方式,所以我这样做是为了让它看起来更好......我在表单中添加了一个标签,将标签的 BorderStyle 设置为 FixedSingle,将 AutoSize 设置为 False,然后鼠标右键单击它并选择“发送到后面”,然后我将标签的大小调整为比组合框稍大并放置标签就在 Combobox 后面,现在看起来不错。
    【解决方案4】:

    Igby Largeman 的回答让我成功了 95%。并归功于 Sasha Bond 的画笔着色,以便在选择时设置 HighlightText 颜色。

    我为达到 100% 所做的一些改进是从 ComboBox 的 ForeColor 添加画笔颜色并在索引为 -1 时进行处理(并将其设置为 -1 以使其行为与正常的下拉样式 ComboBox 完全相同)。

    最重要的是,将其设置回标准下拉样式时,它仍然可以正常运行。

    private void comboBox1_DrawItem ( object sender, DrawItemEventArgs e )
    {
      int index = e.Index >= 0 ? e.Index : -1;
      Brush brush = ( ( e.State & DrawItemState.Selected ) > 0 ) ? SystemBrushes.HighlightText : new SolidBrush ( comboBox1.ForeColor );
      e.DrawBackground ();
      if ( index != -1 )
      {
        e.Graphics.DrawString ( comboBox1.Items[index].ToString (), e.Font, brush, e.Bounds, StringFormat.GenericDefault );
      }
      e.DrawFocusRectangle ();
    }
    

    【讨论】:

      【解决方案5】:
          private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
          {
              var cmb = (ComboBox) sender;
              if (cmb == null) return;
      
              if (e.Index % 2 == 0)
              {
                  e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
                  e.Graphics.DrawString(cmb.Items[e.Index].ToString(), cmb.Font, SystemBrushes.GrayText, e.Bounds);
              }
              else
              {
                  e.DrawBackground();
      
                  // change background color
                  e.Graphics.FillRectangle(Brushes.AntiqueWhite, e.Bounds);
      
                  // change foreground color
                  Brush brush = ((e.State & DrawItemState.Selected) > 0) ? SystemBrushes.HighlightText : SystemBrushes.ControlText;
      
                  e.Graphics.DrawString(cmb.Items[e.Index].ToString(), cmb.Font, brush, e.Bounds);
                  e.DrawFocusRectangle();
              }
          }
      

      【讨论】:

        【解决方案6】:

        这是我用于另一个可能感兴趣的初学者的 vb 项目。可以将事件的发送者用作触发它的组合框。通过强制转换,您可以访问列表中的元素。我还更改了图形 TextRenderingHint 以获得更好的字体显示。

        Private Sub PaintComboBoxItem(sender As Object, e As DrawItemEventArgs)
            Dim combobox As ComboBox = sender
            Dim index As Integer = If(e.Index >= 0, e.Index, 0)
            Dim brush As Brush = If(combobox.Enabled,
                                        New SolidBrush(m_UITheme.TitleColor),
                                        New SolidBrush(m_UITheme.White))
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality
            e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
            e.DrawBackground()
            e.Graphics.DrawString(combobox.Items(index).ToString(), combobox.Font, brush, e.Bounds, StringFormat.GenericDefault)
            e.DrawFocusRectangle()
        End Sub
        

        【讨论】:

          猜你喜欢
          • 2018-12-27
          • 1970-01-01
          • 1970-01-01
          • 2014-07-15
          • 2020-09-02
          • 2016-07-09
          • 2018-04-16
          • 2014-03-13
          • 1970-01-01
          相关资源
          最近更新 更多