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

Posted

技术标签:

【中文标题】是否有 GetThemeColor / Visual Styles API 的有效参数组合列表【英文标题】:Is there a list of valid parameter combinations for GetThemeColor / Visual Styles API 【发布时间】:2010-12-25 16:37:29 【问题描述】:

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

GetSysColor(COLOR_ACTIVECAPTION); 

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

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

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

Property Identifiers 和 Parts and States

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

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

返回“未找到元素”。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于是否有 GetThemeColor / Visual Styles API 的有效参数组合列表的主要内容,如果未能解决你的问题,请参考以下文章

std::vector是否永远都有连续内存?

win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visua

在 DLLMain 中调用 CUDA 函数

asp.net core开发环境准备

使用 Linux C 代码和头文件编译 Windows DLL

PCH警告:标题停止不能在宏或#if块中[重复]