【发布时间】:2010-11-05 10:26:11
【问题描述】:
在启用 Aero 的 Vista 上,正常模式下的窗口标题具有黑色文本(写在浅色玻璃上),而最大化时标题为白色(写在深色玻璃上)。
如何确定窗口标题的当前颜色?
附:在SystemColors.ActiveCaptionTextColor之后我写了一个程序来观看,但是在两种模式下都一样。
【问题讨论】:
标签: .net windows user-interface colors
在启用 Aero 的 Vista 上,正常模式下的窗口标题具有黑色文本(写在浅色玻璃上),而最大化时标题为白色(写在深色玻璃上)。
如何确定窗口标题的当前颜色?
附:在SystemColors.ActiveCaptionTextColor之后我写了一个程序来观看,但是在两种模式下都一样。
【问题讨论】:
标签: .net windows user-interface colors
系统颜色实际上并没有改变。您看到的是 Aero 主题 在窗口中的应用。有一些主题 API 可用于获取主题特定的颜色,但我的使用经验并不那么出色。
评论更新: 看看VisualStyleRenderer 和 GetColor 方法。
【讨论】:
我也不能让 VisualStyleRenderer 告诉我任何事情。
您可以选择:
因为 MaxCaption 为 最大化 窗口的标题栏的每个状态提供 VisualStyleElement 对象。
除非它实际上不起作用。如果您询问活动最大化窗口的标题文本颜色:
VisualStyleRenderer renderer =
new VisualStyleRenderer(VisualStyleElement.Window.MaxCaption.Active);
Color c = renderer.GetColor(ColorProperty.TextColor);
它为 Caption 和 MaxCaption 返回 black。
其实两者之间几乎所有的颜色都是一样的:
我的猜测是,没有办法让您的应用程序具有与操作系统相同的外观和感觉。
【讨论】:
您为什么不尝试在表单中侦听SystemColorsChanged 事件?
SystemColorsChanged += new EventHandler(Form1_SystemColorsChanged);
void Form1_SystemColorsChanged(object sender, EventArgs e)
{
//try repainting or refreshing your application
}
我知道这不是确切的解决方案,但您可以从这里开始工作。
【讨论】:
关于基于VisualStyleRenderer 的建议,可能值得注意的是,出于性能原因,显然最大化的窗口标题由 Vista DWM(桌面窗口管理器)专门处理,请参阅Raymond Chen's explanation 了解(某些)详细信息。
现在,我还没有深入了解 Aero 主题本身,但它实际上可能为正常和最大化标题定义了相同的 TextColor,而后者只是没有被 DWM 使用。
也就是说我猜想Vista中的字幕文本颜色确实是由VisualStyleElement.Window.Caption.Active决定的主题普通窗口,但前SystemColors.ActiveCaptionTextColor只适用于最大化窗口;不幸的是,您已经发现事实并非如此。
所以也许 DWM 只是在渲染最大化的窗口标题时应用一个内部默认值?如果是这种情况,您无法检测到“设计”的标题文本颜色变化,而是需要依靠观察最大化的窗口状态并在本地应用 DWM 默认值。
【讨论】: