OpenThemeData函数有哪些可能的类?

时间:2008-10-20 04:44:44

标签: c++ winapi mfc themes msdn

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

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

有人可以告诉我可以传递给该参数的可接受的类名是什么吗? 谢谢!

5 个答案:

答案 0 :(得分:11)

MSDN上的文章Parts and States包含一个显示控件类部件状态的表。表格中的值在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 Visual Themes: Gallery of Parts and States?的答案提供了“部件和状态资源管理器”应用程序,您可以在其中浏览和测试大多数样式。

答案 1 :(得分:6)

您可以在“AeroStyle.xml”中查看之前的海报,其中提供了Vista / Aero的精确列表。但是,如果您想要安全地玩(并且您可能这样做),通常,类名应该是Windows公共控件的Windows类名。例如,按钮和复选框使用类名“按钮”,编辑控件“编辑”等。我通常选择最接近我正在处理的任何自定义元素的控件的类名,并使用主题数据。这样,无论用户选择的主题实际是什么,您都可以获得适用于XP,Vista和(希望)Windows 7的代码。

但是,除非你经常使用原始Win32,否则你可能不会直接使用类名做很多控件创建。类名在MSDN中非常自由地散布。一个好的起点通常是Platform SDK中的“CommCtrl.h”文件,它有很多这样的文件,并且它们总是在MSDN帮助中描述各个公共控件。您还可以通过查看.rc文件中的对话框如何在文本编辑器中打开来学习它们:它们包含控件的类名。

答案 2 :(得分:4)

班级名称取决于主题。例如,作为OpenThemeData州的文档:

  

Aero主题的类名称是   在AeroStyle.xml中定义,即   在Include文件夹中找到   Microsoft Windows软件开发   套件(SDK)。

答案 3 :(得分:2)

我知道这是一个古老的问题,但是我想为来自Google的那些人提供最新答案(2018年)。

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

初始答案链接到 MSDN ,其中主题名称,部分和状态的列表非常缺乏竞争性,并且没有更新。

主题是由 UxTheme.dll 绘制的,该文件从Windows文件夹C:\Windows\Resources\Themes\Aero中的文件 aero.msstyles 中读取图像和颜色等。 10。

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

但是我确定的是,在Windows 10版本18282中,Microsoft删除了不再使用的主题“ Clock”,并且添加了许多未记录的主题,例如:“ {{1} }”作为主题类名称传递给TaskBand2CompositedSmallIconsVertical8Light::Taskband2

我也知道,只有通过正确的窗口句柄才能获得多个主题。如果您传递了错误的窗口句柄,则可能会获得另一个主题句柄,其超出预期甚至是OpenThemeData()

我还知道,在过去的两年中,Microsoft内部对其所有代码进行了更改,以使用NULL而不是OpenThemeDataForDpi(),因为Windows 10上的每个显示器可能具有不同的分辨率。

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

答案 4 :(得分:0)

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