活动标题文本颜色 - 检测更改(在.Net中)

时间:2009-06-24 07:43:16

标签: .net windows user-interface colors

在Vista上,启用Aero后,正常模式下的窗口标题为黑色文字(略写浅色玻璃),最大化时标题为白色(写在深色玻璃上)。

如何确定窗口标题的当前颜色?

P.S。我写了一个程序,在SystemColors.ActiveCaptionTextColor之后观看,但它在两种模式下保持不变。

4 个答案:

答案 0 :(得分:1)

系统颜色实际上没有变化。您所看到的是将Aero 主题应用到窗口中。有一些主题API可用于获取主题特定的颜色,但我的经验不如使用它们。

评论更新: 看一下VisualStyleRenderer和GetColor方法。

答案 1 :(得分:1)

我无法让VisualStyleRenderer告诉我任何事情。

您可以选择:

因为 MaxCaption 最大化窗口的标题栏的每个状态提供了VisualStyleElement对象。

除非它实际上不起作用。如果您要求激活的最大化窗口的标题文本颜色:

VisualStyleRenderer renderer = 
   new VisualStyleRenderer(VisualStyleElement.Window.MaxCaption.Active);
Color c = renderer.GetColor(ColorProperty.TextColor);

对于标题 MaxCaption ,它返回黑色

事实上,两者之间的几乎所有颜色都是相同的:

alt text

我的猜测是,没有办法让你的应用程序具有与操作系统相同的外观和感觉。

答案 2 :(得分:0)

为什么不尝试在表单中收听SystemColorsChanged事件?

    SystemColorsChanged += new EventHandler(Form1_SystemColorsChanged);

    void Form1_SystemColorsChanged(object sender, EventArgs e)
    {
        //try repainting or refreshing your application
    }

我知道这不是确切的解决方案,但你可以从这里开始工作。

答案 3 :(得分:0)

关于基于VisualStyleRenderer的建议可能值得注意,出于性能原因,显然最大化的窗口字幕由Vista DWM(桌面窗口管理器)专门处理,有关(某些)详细信息,请参阅Raymond Chen's explanation

现在,我还没有看到Aero主题本身,但它实际上可能为正常和最大化标题定义相同的TextColor,后者只是没有被DWM使用。

那说我猜想Vista中的字幕文本颜色确实由VisualStyleElement.Window.Caption.Active确定为主题正常窗口,而前SystemColors.ActiveCaptionTextColor仅用于最大化窗口;不幸的是,你已经发现情况并非如此。

那么DWM可能只是在渲染最大化窗口字幕时应用内部默认值?如果是这种情况,您无法“按设计”检测到标题文本颜色更改,而是需要依靠观察最大化窗口状态并在本地应用DWM默认值。