【问题标题】:What's the RGB of the Default GroupBox ForeColor?默认 GroupBox ForeColor 的 RGB 是多少?
【发布时间】:2012-05-30 03:17:54
【问题描述】:

在 Visual Studio (WinForms) 中,当您将 GroupBox 控件拖到窗体上时,标题标签将获得默认颜色(蓝色)。现在我知道 Forecolor 属性显示为 "{Name=ControlText, ARGB=(255, 0, 0, 0)}" 但 Name=ControlText 对我来说没用,ARGB 也是如此,它恰好是黑色.

它是什么深浅的蓝色?

我希望能够写作

myLabel.ForeColor = Color.FromArgb(?, ?, ?, ?);

并获得完全相同的蓝色阴影。

(这当然不是火箭科学,但并不像看起来那么容易)。

编辑#1。根据一些答案,我将澄清并改写我的问题。我知道它与主题相关,GroupBox 的 ControlText 与标签的 ControlText 不同。我在使用“Windows XP”主题的 WindowsXP 上。那么在使用 Windows XP 主题时,我如何找到应用于 GroupBox 的这种蓝色阴影(以 RGB 表示)?即是什么? ? ? ?价值观。

【问题讨论】:

  • 这取决于 Windows 主题和版本。
  • 便宜又愉快的方式:截屏,在编辑器中打开,示例像素。
  • @MichaelPetrotta:由于抗锯齿,这不是那么简单。
  • 使用“十六进制颜色查找器”,tucows.com/preview/240092

标签: .net winforms visual-studio groupbox


【解决方案1】:

这完全取决于用户当前的主题。在 Windows Classic 主题、所有 3 个标准 Windows XP Luna 主题、Aero 主题以及 Windows 8 中可能完全出现的其他内容中,组框标题使用了不同的颜色。更不用说它是用户可自定义的,这意味着他们甚至可能没有使用标准的主题颜色。

因此,根据您的计算机上显示的内容对 RGB 值进行硬编码不是一个好计划。这是确保您的应用程序会像拇指酸痛一样突出的好方法。因此,在这个问题的其他答案中建议的截取屏幕截图和采样像素颜色的策略是正确的。错误多于正确。

相反,您需要向系统询问此值,以确保它与用户的当前配置相匹配。这可以分为两种一般可能性:

  1. 用户打开了Visual Styles(主题)服务,这意味着他们正在使用 Luna 或 Aero 之类的东西。

    在这种情况下,您需要查询视觉样式服务以获取适当的颜色。使用System.Windows.Forms.VisualStyles 命名空间中提供的托管包装器,这很简单。例如,您可以编写以下代码(在 C# 中任意编写):

    using System.Windows.Drawing;
    using System.Windows.Forms.VisualStyles;
    // ...
    var vsr = new VisualStyleRenderer(VisualStyleElement.Button.GroupBox.Normal);
    var groupBoxCaptionColor = vsr.GetColor(ColorProperty.TextColor);
    
  2. 用户关闭了视觉样式服务或者它不可用(XP 之前的 Windows 版本),这意味着他们正在使用“Windows 经典”主题。

    在这种情况下,组框使用标准 3D(控制)颜色作为其标题,因此您可以简单地从 System.Drawing.SystemColors 类中获取它。您要查找的属性名为ControlText

    using System.Windows.Drawing;
    // ...
    var groupBoxCaptionColor = SystemColors.ControlText;
    

In a real application, you'll have to put these two cases together in order to handle all possible client configurations。如果 Visual Styles 服务被关闭,第一个路由会爆炸,所以你需要先检查那个(你可以通过查询 Application.RenderWithVisualStyles 属性来做到这一点,如果它被关闭,则回退到第二种方法。有些东西喜欢:

using System.Windows.Drawing;
using System.Windows.Forms.VisualStyles;

// ...

public Color GroupBoxCaptionColor
{
  get
  {
    // Test to see if Visual Styles are enabled.
    if (Application.RenderWithVisualStyles())
    {
      // If Visual Styles are enabled, use that color.
      var vsr = new VisualStyleRenderer(VisualStyleElement.Button.GroupBox.Normal);
      return vsr.GetColor(ColorProperty.TextColor);
    }
    else
    {
      // Otherwise, fall back to the Classic theme.
      return SystemColors.ControlText;  
    }
  }
}

GroupBoxCaptionColor 属性将返回一个Color 对象,该对象对应于用于组框控件标题的当前 颜色。这个Color 对象在技术上将具有 RGB 值,但您必须经历所有这些歌曲和舞蹈,以确保您的应用使用的颜色始终与当前主题颜色同步。

一旦你了解了各种力量的作用,这真的不会太复杂。除了乐趣并没有相当到此结束。您必须考虑是否要处理用户在应用程序运行时更改其系统主题的可能性。在这种情况下,actual 组合框控件的标题颜色会发生变化,但您以编程方式确定的标题颜色会过时,匹配旧主题而不是新主题。

修复是监视SystemEvents.UserPreferenceChanged 事件,当用户在控制面板中更改主题时会引发该事件。在该事件的处理程序方法中,您需要再次获取组框标题颜色,并更新任何可能正在使用它的 UI 元素。

值得特别注意的是,正如上面链接的文档所述,这是一个静态事件,这意味着您必须在应用程序关闭时分离事件处理程序,否则您可能会泄漏内存。

【讨论】:

  • 感谢您的全面回答。我重新表述了我的问题,以澄清我在编辑中寻求的内容。
  • @joe 我已经在这里回答了这个问题。您正在使用 Windows XP“蓝色”主题,该主题在组框上有蓝色标题文本。这里的第一种方法将使用 VisualStyleRenderer 包装类返回该颜色。正如我所解释的,您实际上得到了一个 Color 对象,它代表一个 RGB 值。调用ToArgb() 方法,或查询返回的Color 对象的各个RGB 属性。但是,请允许我再次重申,这样做是错误的。当前值没有什么神奇之处,它改变,并且硬编码 RGB 是错误的。
  • 是的,您确实已经回答了。我刚试了一下,你的 groupBoxCaptionColor 有 RGB Color.FromArgb(255, 0, 70, 213),这是我正在寻找的值!正如我所怀疑的,必须有比求助于 MS Paint 更好的方法。 (至于做错了,也许你对目的假设太多了)。无论如何,一切都归功于你。
  • @Jeremy,几分钟前我看到你有答案,现在它已经消失了。 stackoverflow 允许删除答案吗?!
  • 不,当 Cody 提出这样的答案时,留下我的答案会很尴尬 - 使用 MSPaint!
【解决方案2】:

检查当前为 GroupBox 设置的 ForeColor 是什么,如果它类似于 ControlText 所有这些颜色都来自 Windows 主题。您可以使用SystemColors 获取颜色,如下所示,

myLabel.ForeColor = SystemColors.ControlText; 

请检查您是否可以从以下颜色中找到它。

如果你想获得金色,那么:Color.Gold

图片来自here

【讨论】:

  • 当这是一个 WinForms 问题时,您为什么要引用 WPF 问题?
  • 请注意,对于某些主题(尤其是 XP Luna 主题),组框标题颜色与控件文本颜色 (SystemColors.ControlText) 相同。例如,在 XP Blue 主题中,它是蓝色的;在 XP Green 主题中,它是棕色的。要获得正确的值,您需要查询视觉样式服务并在视觉样式不可用或禁用时回退到SystemColors.ControlText。另外,不要硬编码像Color.Gold 这样的值。这要么看起来丑陋和格格不入,要么丑陋且难以阅读。 (我的回答中有更多细节。)
猜你喜欢
  • 2011-06-01
  • 2014-10-20
  • 2018-07-12
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多