【问题标题】:What are the possible classes for the OpenThemeData function?OpenThemeData 函数有哪些可能的类?
【发布时间】:2010-09-18 01:37:01
【问题描述】:

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

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

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

【问题讨论】:

    标签: c++ winapi mfc themes msdn


    【解决方案1】:

    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? 问题的答案提供了一个“Parts and States Explorer”应用程序,您可以在其中浏览和测试大多数样式。

    【讨论】:

      【解决方案2】:

      您可以查看“AeroStyle.xml”,如之前的海报所述,它提供了 Vista/Aero 的确切列表。但是,如果您想安全起见(并且您可能会这样做),类名通常应该是 Windows 通用控件的 Windows 类名。例如,按钮和复选框使用类名“Button”,编辑控件“Edit”等。我通常选择最接近我正在处理的任何自定义元素的控件的类名,并使用主题数据。这样,您将获得适用于 XP、Vista 和(希望如此)Windows 7 的代码,而不管用户选择的主题实际上是什么。

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

      【讨论】:

      • 此文件在 Windows 10 SDK 中不再存在。
      【解决方案3】:

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

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

      MSDN 的初始链接的答案,其中主题名称、部分和状态列表非常不完整且未更新。

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        类名取决于主题。例如,OpenThemeData 的文档指出:

        Aero 主题的类名是 在 AeroStyle.xml 中定义,即 在包含文件夹中找到 微软视窗软件开发 套件 (SDK)。

        【讨论】:

        • 你在 2008 年发布了这个。我在这里有一个 2015 年的 Windows 10 SDK,这个 XML 文件不存在。但是它存在于 Windows 7 SDK 中。但即使这个 XML 文件也不完整。例如,缺少“时钟”类。
        • 是的,Microsoft 在将旧文档更新到最新的操作系统/平台版本时确实存在问题。 :-) 不幸的是,我自 2011 年以来就没有看过 Windows,所以对更新这个答案没有太大帮助。
        【解决方案5】:

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

        【讨论】:

        • Aero 被作为一个例子给出,可以在其中查找有关主题支持的各种类名称的更多信息。你不应该暗示没有指定的连接。
        • 我想您想将此作为对 DavidK 答案的评论而不是自己的答案发布,因为这不是问题的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多