OpenThemeData函数有哪些可能的类?
题
我正在尝试调用OpenThemeData(请参阅msdn OpenThemeData )函数,但我无法确定 pszClassList
参数传递的可接受的类名是什么。
HTHEME OpenThemeData(
HWND hwnd,
LPCWSTR pszClassList
);
有人能告诉我可以传递给该参数的可接受的类名是什么吗? 谢谢!
解决方案
您可以查看“AeroStyle.xml”。正如上一张海报所述,它提供了Vista / Aero的精确列表。但是,如果您想要安全地玩(并且您可能这样做),通常,类名应该是Windows公共控件的Windows类名。例如,按钮和复选框使用类名“按钮”,编辑控件“编辑”等。我通常选择最接近我正在处理的任何自定义元素的控件的类名,并且使用主题数据。这样,无论用户选择的主题实际是什么,您都可以获得适用于XP,Vista和(希望)Windows 7的代码。
但是,除非你经常使用原始Win32,否则你可能不会直接使用类名做很多控件创建。类名在MSDN中非常自由地散布。一个好的起点通常是“CommCtrl.h”。来自Platform SDK的文件,其中包含很多文件,并且它们总是在MSDN帮助中对各个公共控件进行描述。您还可以通过查看.rc文件中的对话框如何在文本编辑器中打开来学习它们:它们包含控件的类名。
其他提示
文章 零件和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 Visual Themes:零件和状态库?提供了“零件和状态浏览器”应用程序,您可以在其中浏览和测试大多数样式。
班级名称取决于主题。例如,作为 OpenThemeData 的文档说明:
Aero主题的类名称是 在AeroStyle.xml中定义,即 在Include文件夹中找到 Microsoft Windows软件开发 套件(SDK)。
我知道这是一个老问题,但我想为那些来自谷歌的人提供更新的答案(2018年)。
DavidK接受的答案是查看文件“ AeroStyle.xml ”定义主题的位置。此文件是Windows 7 SDK的一部分,但已从Windows 10 SDK中删除,因此已接受的答案不再有用。
启动的答案链接到 MSDN ,其中主题名称,部分和状态列表高度不合并且未更新。
主题由 UxTheme.dll 绘制,它从 C:\ Windows文件夹中的 aero.msstyles 文件中读取图像和颜色等。 Windows 10上的\ Resources \ Themes \ Aero
。
但是当您在十六进制编辑器中打开此文件时,您将找不到所有主题的名称。我不知道是否有一种方法可以枚举所有可以传递给 OpenThemeData()
的现有主题类名。我想这是不可能的。
但我确切知道的是,在Windows 10 build 18282中,Microsoft删除了主题“ Clock
”。这已被添加,并且已添加了许多未记录的主题,例如:“ TaskBand2CompositedSmallIconsVertical8Light :: Taskband2
”它作为主题类名称传递给 OpenThemeData()
。
而且我也知道只有传递正确的窗口句柄才能获得几个主题。如果你传递了错误窗口的句柄,你可能会获得比预期更多的主题句柄,甚至 NULL
。
我也知道微软在过去的两年内已经改变了所有代码,使用 OpenThemeDataForDpi()
而不是 OpenThemeData()
,因为Windows 10上的每个监视器都可能有不同的分辨率。
我们遇到的问题是MSDN严重缺乏文档,缺乏枚举所有可用主题的API函数。
它与Aero无关,甚至在XP上也不存在! 请参阅OpenThemeData()的源代码..