在Vista上,启用了Aero后,标准模式下的窗口标题为黑色文字(写在轻微的玻璃杯上),而最大化标题为白色(写在黑色玻璃上)。
我怎样才能确定窗口标题的当前颜色?
PS我写了一个程序来观看SystemColors.ActiveCaptionTextColor
后,但在两种模式下保持不变。
系统颜色实际上并没有改变。 你所看到的是Aero 主题在窗口中的应用。 有主题API可以抓住主题特定的颜色,但我的经验一直不如恒星使用它们。
从注释更新:看看VisualStyleRenderer和GetColor方法。
我不能让VisualStyleRenderer告诉我任何事情。
您可以选择:
因为MaxCaption 为最大化窗口的标题栏的每个状态提供了VisualStyleElement对象。
除了它实际上不工作。 如果您要求激活最大化窗口的标题文本颜色:
VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Window.MaxCaption.Active); Color c = renderer.GetColor(ColorProperty.TextColor);
它返回黑色 , Caption和MaxCaption 。
事实上,两者之间几乎所有的颜色都是一样的:
替代文字http://img.zgserver.com/windows/3994h.png
我的猜测是,没有办法让你的应用程序具有与操作系统相同的外观和感觉。
你为什么不尝试在窗体中监听SystemColorsChanged事件?
SystemColorsChanged += new EventHandler(Form1_SystemColorsChanged); void Form1_SystemColorsChanged(object sender, EventArgs e) { //try repainting or refreshing your application }
我知道这不是确切的解决方案,但你可以从这里开始工作。
关于基于VisualStyleRenderer
的建议,可能值得注意的是,出于性能原因,显然最大化的窗口标题由Vista DWM(桌面窗口管理器)专门处理,请参阅Raymond Chen对某些细节的解释 。
现在,我还没有偷看到Aero主题本身,但它可能实际上为正常和最大化的标题定义了相同的TextColor,后者只是没有被DWM使用。
这就是说,我会猜想Vista中的字幕文本颜色的确是由VisualStyleElement.Window.Caption.Active
为主题的正常窗口,但前者SystemColors.ActiveCaptionTextColor
为最大化窗口; 不幸的是,你已经发现,事实并非如此。
所以也许DWM只是在渲染最大化的窗口标题时应用内部默认值? 如果是这种情况,则无法检测字幕文本颜色是否按设计改变,而是需要依据观察最大化的窗口状态,并在本地应用DWM默认值。