6

我正在尝试检索任务栏和/或我的应用程序主窗口的背景和文本颜色。事实证明,Windows 7 没有返回正确的颜色。如果我切换到粉红色主题,Windows 7 仍会为窗口标题返回浅蓝色,尽管这不是真的。这发生使用

GetSysColor(COLOR_ACTIVECAPTION); 

以及使用 HTHEME hTheme = OpenThemeData(hwnd, L"WINDOW");

HRESULT result = GetThemeColor(      
                hTheme,
                WP_CAPTION, 
                CS_ACTIVE, 
                TMT_FILLCOLORHINT, 
                &color);

此外,我发现自己尝试各种参数组合来找出标题文本的颜色。我知道微软的页面

属性标识符部件和状态

但是这数百个参数的大多数组合都是无效的。是否有可以使用哪些组合的列表和/或描述?

IE

 GetThemeColor(      
                    hTheme,
                    WP_CAPTION, // BP_PUSHBUTTON,
                    CS_ACTIVE, 
                    TMT_CAPTIONTEXT,
                    &color);

返回“未找到元素”。

4

3 回答 3

9

根据我对 XP 主题的了解,.msstyles 文件只是具有任意定义的图像和属性(颜色、大小、字体等)的部件定义的集合。UxTheme API 只返回此文件中的任何内容,并且属性的特定组合的存在基本上取决于主题作者(这就是为什么您应该始终回退到 "classic" GetSysColorGetSystemMetrics或者SystemParametersInfo如果主题 API 无法返回任何内容你正在寻找。

但是,您在这里提到了“粉红色主题”,所以我假设您说的是 Aero Glass 主题。Aero 主题颜色由 DWM 处理,并且与经典或 UxTheme API 颜色分开。为了检索 Aero 窗口颜色,您必须使用DwmGetColorizationColor,它将以 0xAARRGGBB 格式返回(而不是COLORREF0x00BBGGRR,因此您需要在两种格式之间进行转换)。为了首先查找是否启用了 DWM 合成(又名“Aero Glass”),您必须调用DwmIsCompositionEnabled.

于 2009-12-11T21:04:33.370 回答
0

属性常量(即主题函数接受的 iPartId 参数)只是提供了一组主题定义可能(不是必须)为各种类/部件/样式组合定义的内容。

即您的代码必须准备好回退到以其他方式确定的颜色。

查看 XP (Luna) 或 Vista/7 (Aero) 上的标准主题定义通常很有用。为此,您可以使用一些这样做,例如 ThemeExplorer:http: //sourceforge.net/projects/mctrl/files/theme-explorer/

于 2012-06-13T11:25:24.313 回答
0

理解这一点的最简单方法是:实心标题栏的颜色仍然是浅蓝色。

然而,当启用 aero 时,标题栏文本以完全透明的背景呈现,因此(大部分)是 DWM 为框架着色的任何颜色。

于 2009-12-11T21:22:17.973 回答