.net 什么';默认GroupBox前景色的RGB是多少?

.net 什么';默认GroupBox前景色的RGB是多少?,.net,winforms,visual-studio,groupbox,.net,Winforms,Visual Studio,Groupbox,在VisualStudio(WinForms)中,当您将GroupBox控件拖到表单上时,标题标签将获得默认颜色(蓝色)。现在我知道Forecolor属性显示为“{Name=ControlText,ARGB=(255,0,0)}”,但是Name=ControlText对我来说是无用的,ARGB也是无用的,它恰好是黑色的 它是什么颜色的蓝色 我想能够写作 myLabel.ForeColor = Color.FromArgb(?, ?, ?, ?); 得到完全相同的蓝色 (这当然不是火箭科学,但也

在VisualStudio(WinForms)中,当您将GroupBox控件拖到表单上时,标题标签将获得默认颜色(蓝色)。现在我知道Forecolor属性显示为“{Name=ControlText,ARGB=(255,0,0)}”,但是Name=ControlText对我来说是无用的,ARGB也是无用的,它恰好是黑色的

它是什么颜色的蓝色

我想能够写作

myLabel.ForeColor = Color.FromArgb(?, ?, ?, ?);
得到完全相同的蓝色

(这当然不是火箭科学,但也不像看上去那么容易)


编辑#1。根据一些答案,我将澄清并重新表述我的问题。我知道它与主题有关,GroupBox的ControlText与标签的ControlText不同。我在WindowsXP上使用“WindowsXP”主题。那么,在使用Windows XP主题时,如何找到应用于GroupBox的蓝色阴影(以RGB表示)?i、 e.有什么问题?值。

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

myLabel.ForeColor = SystemColors.ControlText; 
请检查是否可以从下面的颜色中找到它

如果你想得到金色,那么:
color.gold


来自

的图像这完全取决于用户当前的主题。Windows经典主题、所有3个标准Windows XP Luna主题、Aero主题中的分组框标题都使用了不同的颜色,也许还有其他一些完全在Windows 8中出现的颜色。更不用说它的用户自定义,这意味着他们甚至可能不使用标准的主题颜色

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

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

  • 用户打开了(主题)服务,这意味着他们正在使用类似Luna或Aero的东西

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

  • 用户已关闭视觉样式服务或该服务不可用(XP之前的Windows版本),这意味着他们正在使用“Windows经典”主题

    在本例中,组框的标题使用标准的3D(控件)颜色,因此您只需从类中获取即可。您要查找的属性名为
    ControlText

    using System.Windows.Drawing;
    // ...
    var groupBoxCaptionColor = SystemColors.ControlText;
    
  • 。如果关闭视觉样式服务,第一个路由将爆炸,因此您需要检查第一个路由(您可以通过查询属性来执行此操作,如果关闭,则返回第二个方法。类似于:

    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值,但您必须完成所有这些歌曲和舞蹈,以确保应用程序使用的颜色始终同步与当前主题颜色一致

    一旦你理解了工作中的各种力量,它就不太复杂了。除了乐趣还没有完全结束。你必须考虑是否要处理用户在应用程序运行时改变系统主题的可能性。在这种情况下,实际的组框控件的标题颜色会改变,但是你r编程确定的标题颜色将过时,与旧主题匹配,而不是与新主题匹配

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


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

    这取决于Windows主题和版本。便宜而愉快的方法:截图,在编辑器中打开,然后在mple pixel.@MichaelPetrotta:由于抗锯齿,这并不简单。使用“十六进制颜色查找器”,当这是WinForms问题时,为什么要引用WPF问题?请注意,对于某些主题(特别是XP Luna主题),组框标题颜色与控件文本颜色不同(
    SystemColor.ControlText
    )。例如,在XP蓝色主题中,它是蓝色的;在XP绿色主题中,它是棕色的。要获得正确的值,您需要查询视觉样式服务,如果视觉样式不可用或被禁用,则返回到
    SystemColor.ControlText
    。此外,请不要硬编码像
    Color.Gold
    这样的值。这样的值要么看起来很难看,要么是nd不合适,或可怕且不可读。(更多详细信息,请参见我的回答。)感谢您的全面回答。我已重新措辞了我的问题,以澄清我在编辑中寻求的内容。@joe我已在此处回答了该问题。您使用的是Windows XP“蓝色”主题,在组框上有蓝色标题文本。这里的第一种方法将使用
    VisualStyleRenderer
    包装类返回该颜色。正如我所解释的,您实际上得到了一个
    color
    对象,它表示RGB值。调用
    方法,或查询个人
    R
    G
    Busing 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;  
        }
      }
    }