是否有GetThemeColor / Visual Styles API的有效参数组合列表

时间:2009-12-11 14:18:55

标签: c windows winapi windows-7 windows-themes

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

发生的
GetSysColor(COLOR_ACTIVECAPTION); 

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

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

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

Property IdentifiersParts and States

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

即。

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

返回“找不到元素”。

3 个答案:

答案 0 :(得分:9)

根据我对XP主题的了解,.msstyles文件只是具有图像和属性(颜色,大小,字体等)的零件定义的集合,所有这些都是任意定义的。 UxTheme API只返回此文件中的任何内容,并且某些属性组合的存在取决于主题作者,基本上(这就是为什么你应该总是回到“经典”GetSysColor,{{1} }或GetSystemMetrics如果主题API无法返回您要查找的内容。

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

答案 1 :(得分:0)

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

然而,当启用aero时,标题栏文本将以完全透明的背景呈现,因此(大多数情况下)是DWM对帧进行着色的任何颜色。

答案 2 :(得分:0)

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

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

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