我正在尝试调用OpenThemeData(请参阅msdn-OpenThemeData)函数,但我无法确定pszClassList
参数传入的可接受类名。
HTHEME OpenThemeData(
HWND hwnd,
LPCWSTR pszClassList
);
有人能告诉我,我可以传递到该参数中的可接受类名是什么吗?谢谢
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
问题的答案Windows视觉主题:部件和状态库?提供了"Parts and States Explorer"应用程序,您可以在其中浏览和测试大多数样式。
我知道这是一个老问题,但我想给那些从谷歌来这里的人一个最新的答案(2018)。
DavidK的公认答案是,调查文件"AeroStyle.xml";其中定义了主题。此文件是Windows 7 SDK的一部分,但已从Windows 10 SDK中删除,因此接受的答案不再有用。
splash的答案链接到MSDN,其中的主题名称、部分和状态列表非常不完整,并且没有更新。
主题由UxTheme.dll绘制,它从Windows 10上文件夹C:WindowsResourcesThemesAero
中的文件aero.msstyles中读取图像和颜色等。
要查看XYZ.msstyles文件中的类,请使用msstyles。编辑:https://github.com/nptr/msstyleEditor
只有通过正确的窗口句柄,才能获得多个主题。似乎有一种自动机制可以从窗口把手检测控件的类型。如果你传递了错误窗口的句柄,你可能会得到另一个超出预期的主题句柄,甚至NULL
。
微软内部已将所有代码更改为使用OpenThemeDataForDpi()
而不是OpenThemeData()
,因为Windows 10上的每个监视器可能具有不同的分辨率。
我们这里的问题是MSDN中严重缺乏文档,并且缺少一个API函数来枚举所有可用的主题。为微软感到羞耻(再一次)。
您可以查看"AeroStyle.xml",如前一张海报所示,它给出了Vista/Aero的确切列表。然而,如果你想保持安全(你可能做到了),类名通常应该是Windows通用控件的Windows类名。例如,按钮和复选框使用类名"Button"、编辑控件"edit"等。我通常会选择最接近我正在处理的任何自定义元素的控件的类名,并为此使用主题数据。这样,无论用户选择的主题是什么,你都可以获得适用于XP、Vista和(希望如此)Windows7的代码
但是,除非您经常使用原始Win32,否则可能不会直接使用类名创建太多控件。类名在MSDN中分布得相当广泛。一个很好的起点通常是Platform SDK中的"CommCtrl.h"文件,该文件中有很多这样的文件,并且它们总是在MSDN帮助中关于各个通用控件进行描述。您还可以通过在文本编辑器中打开.rc文件来了解对话框是如何在.rc文件中定义的:这些文件包含控件的类名。
类名取决于主题。例如,正如OpenThemeData的文档所述:
Aero主题的类名为定义在AeroStyle.xml中在的Include文件夹中找到Microsoft Windows软件开发工具包(SDK)。
它与Aero无关,Aero甚至在XP上都不存在!请参阅OpenThemeData()的源代码。。