OpenThemeData函数可能有哪些类

What are the possible classes for the OpenThemeData function?

本文关键字:可能有 函数 OpenThemeData      更新时间:2023-10-16

我正在尝试调用OpenThemeData(请参阅msdn-OpenThemeData)函数,但我无法确定pszClassList参数传入的可接受类名。

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

有人能告诉我,我可以传递到该参数中的可接受类名是什么吗?谢谢

MSDN上的部件和状态文章包含一个表,其中显示了控制类部件状态。表中的值在Vsstyle.hVssym32.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()的源代码。。