C++ OpenThemeData函数的可能类有哪些?

C++ OpenThemeData函数的可能类有哪些?,c++,winapi,mfc,themes,msdn,C++,Winapi,Mfc,Themes,Msdn,我试图调用OpenThemeData(请参见msdn)函数,但无法确定pszClassList参数传入的可接受类名 HTHEME OpenThemeData( HWND hwnd, LPCWSTR pszClassList ); 谁能告诉我可以传递到该参数中的可接受类名是什么? 谢谢 类名取决于主题。例如,作为国家的文件: Aero主题的类名为 在AeroStyle.xml中定义,即 在的Include文件夹中找到 Microsoft Windows软件开发 工具包

我试图调用OpenThemeData(请参见msdn)函数,但无法确定
pszClassList
参数传入的可接受类名

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);
谁能告诉我可以传递到该参数中的可接受类名是什么?
谢谢

类名取决于主题。例如,作为国家的文件:

Aero主题的类名为 在AeroStyle.xml中定义,即 在的Include文件夹中找到 Microsoft Windows软件开发 工具包(SDK)

您可以在“AeroStyle.xml”中查看前面的海报,其中给出了Vista/Aero的确切列表。但是,如果您想安全起见(您可能会这样做),通常情况下,类名应该是Windows公用控件的Windows类名。例如,按钮和复选框使用类名“Button”,编辑控件“edit”,等等。我通常选择最接近我正在处理的自定义元素的控件类名,并使用主题数据。这样,无论用户选择的主题是什么,您都可以获得适用于XP、Vista和(希望是)Windows7的代码


然而,除非您经常使用原始Win32,否则您可能不会直接使用类名创建很多控件。类名称在整个MSDN中分布得相当广泛。一个好的起点通常是平台SDK中的“CommCtrl.h”文件,其中有很多文件,MSDN帮助中对各个常用控件都有描述。您还可以通过在文本编辑器中打开对话框来了解.rc文件中如何定义对话框:这些对话框包含控件的类名。

它与Aero无关,Aero甚至在XP上都不存在! 请参阅OpenThemeData()的源代码。…

MSDN上的文章包含一个表,其中显示了控件类、部分和状态。表中的值在
Vsstyle.h
Vssym32.h
中定义

这里是一个快速参考:

BUTTON, CLOCK, COMBOBOX, COMMUNICATIONS, CONTROLPANEL, DATEPICKER, DRAGDROP, 
EDIT, EXPLORERBAR, FLYOUT, GLOBALS, HEADER, LISTBOX, LISTVIEW, MENU, MENUBAND, 
NAVIGATION, PAGE, PROGRESS, REBAR, SCROLLBAR, SEARCHEDITBOX, SPIN, STARTPANEL, 
STATUS, TAB, TASKBAND, TASKBAR, TASKDIALOG, TEXTSTYLE, TOOLBAR, TOOLTIP, 
TRACKBAR, TRAYNOTIFY, TREEVIEW, WINDOW

这个问题的答案提供了一个“部件和状态浏览器”应用程序,您可以在其中浏览和测试大多数样式。

我知道这是一个老问题,但我想为来自谷歌的人提供一个更新的答案(2018年)

DavidK的公认答案是查看定义主题的文件“AeroStyle.xml”。此文件是Windows 7 SDK的一部分,但已从Windows 10 SDK中删除,因此接受的答案不再有用

splash的答案链接到MSDN,其中主题名称、部分和状态的列表非常不完整,没有更新

主题由UxTheme.dll绘制,它从Windows 10上的文件夹
C:\Windows\Resources\themes\aero
中的文件aero.msstyles读取图像和颜色等

但是,当您在十六进制编辑器中打开此文件时,将找不到所有主题的名称。我不知道是否有办法枚举所有可以传递给
OpenThemeData()
的现有主题类名。我想这是不可能的

但我可以肯定的是,在Windows 10 build 18282中,Microsoft删除了不再使用的主题“
时钟”
,并添加了许多未记录的主题,例如:“
TaskBand2CompositedSmalliconVertical8Light::Taskband2
”,该主题作为主题类名传递给
OpenThemeData()

我还知道,只有通过正确的窗口句柄,才能获得几个主题。如果传递了错误窗口的句柄,则可能会得到另一个超出预期的主题句柄,甚至
NULL

我还知道,在过去两年中,微软内部已将其所有代码更改为使用
openmotedatafordpi()
而不是
openmotedata()
,因为Windows 10上的每个显示器可能具有不同的分辨率


我们在这里遇到的问题是MSDN中严重缺乏文档,并且缺少枚举所有可用主题的API函数。

Aero作为一个示例,可以在其中查找主题支持的各种类名的更多信息。你不应该暗示没有指定的连接。我想你想把它作为对DavidK答案的评论,而不是自己的答案,因为这不是问题的答案。你是在2008年发布的。我这里有一个2015年的Windows 10 SDK,但此XML文件不存在。但是,它存在于Windows 7 SDK中。但即使是这个XML文件也不完整。例如,类“Clock”丢失。是的,Microsoft在将旧文档更新到最新的操作系统/平台版本时确实存在问题。:-)不幸的是,我从2011年起就没有看过Windows,所以更新这个答案实在帮不了什么忙。这个文件在Windows 10 SDK中已经不存在了。