在Visual Studio(WinForms)中,当您将GroupBox控件拖到Form上时,标题标签会获得默认颜色(蓝色)。现在我知道Forecolor属性显示为“{Name = ControlText,ARGB =(255,0,0,0)}”但是Name = ControlText对我来说没用,ARGB也是如此,它恰好是黑色的
它是什么颜色的蓝色?
我希望能够写
myLabel.ForeColor = Color.FromArgb(?, ?, ?, ?);
并获得完全相同的蓝色阴影。
(当然这不是火箭科学,但它并不像看起来那么容易)。
EDIT#1。基于一些答案,我将澄清并重新解释我的问题。我知道它与主题相关联,而GroupBox的ControlText与Label的ControlText不同。我在WindowsXP上使用“Windows XP”主题。然后,当我使用Windows XP主题时,如何找到应用于GroupBox的蓝色阴影(就RGB而言)?即什么? ? ? ?值。
答案 0 :(得分:3)
这完全取决于用户当前的主题。 Windows Classic主题中的组框标题使用了不同的颜色,所有3个标准Windows XP Luna主题,Aero主题,以及Windows 8中可能完全出现的其他内容。更不用说它的用户可自定义,这意味着他们甚至可能没有使用标准主题颜色。
根据 计算机上显示的内容对RGB值进行硬编码因此不是一个好计划。这是确保您的应用程序像拇指疼痛一样突出的好方法。因此,在另一个答案中建议采用屏幕截图并对像素颜色进行采样的策略是正确的。这将是错误的,而不是正确的。
相反,您需要向系统询问此值以确保它与用户的当前配置相匹配。这可以分为两种一般可能性:
用户已启用Visual Styles(主题)服务,这意味着他们正在使用Luna或Aero等内容。
在这种情况下,您需要查询Visual Styles服务以获取适当的颜色。使用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);
用户将Visual Styles服务转为 off ,或者它不可用(XP之前的Windows版本),这意味着他们正在使用“Windows Classic”主题。
在这种情况下,组框使用标准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。如果关闭视觉样式服务,第一条路线将会爆炸,因此您需要首先检查(您可以通过查询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值,但您必须完成所有这首歌曲和舞蹈,以确保您的应用程序使用的颜色始终与当前主题颜色同步。
一旦你理解了工作中的各种力量,这真的不会太复杂。除了乐趣不相当结束。您必须考虑是否要在应用程序运行时处理用户更改系统主题的可能性。在这种情况下,实际组框控件的标题颜色会发生变化,但您的编程确定的标题颜色将过时,与旧主题相匹配,而不是新主题。
修复程序正在监视SystemEvents.UserPreferenceChanged
事件,该事件是在用户在“控制面板”中更改其主题时引发的。在该事件的处理程序方法中,您需要再次获取组框标题颜色,并更新可能正在使用它的任何UI元素。
值得特别注意的事实是,正如上面链接的文档所指出的,这是一个静态事件,这意味着您必须在关闭应用程序时分离事件处理程序,否则您可能会泄漏内存。
答案 1 :(得分:0)
检查当前为GroupBox设置的ForeColor
是什么,如果它类似于ControlText
,则所有这些颜色都来自Windows主题。您可以使用SystemColors
获取颜色,如下所示
myLabel.ForeColor = SystemColors.ControlText;
请检查您是否可以从以下颜色中找到它。
如果你想得到金色:Color.Gold
来自here的图片