启用视觉样式

本主题介绍如何配置应用程序以确保公共控件以用户的首选视觉样式显示。

本主题包含以下各节。

使用清单或指令确保可以将视觉样式应用于应用程序

若要使应用程序能够使用视觉样式,必须使用 ComCtl32.dll 版本6或更高版本。 由于版本6是不可再发行的,因此仅当你的应用程序在包含它的 Windows 版本上运行时才可用。 Windows 附带版本5和版本6。 ComCtl32.dll 版本6包含用户控件和公共控件。 默认情况下,应用程序使用 User32.dll 中定义的用户控件和 ComCtl32.dll 版本5中定义的公共控件。 有关 DLL 版本及其分发平台的列表,请参阅 公共控制版本

如果你希望你的应用程序使用视觉样式,则必须添加应用程序清单或编译器指令,该指令指示 ComCtl32.dll 版本6应在可用时使用。

应用程序清单允许应用程序指定其所需的程序集版本。 在 Microsoft Win32 中,程序集是一组 Dll 以及包含在这些 Dll 中的无版本冲突对象的列表。

清单以 XML 编写。 应用程序清单文件的名称是可执行文件的名称,后跟文件扩展名 .manifest;例如,MyApp.exe。 下面的示例清单显示第一部分描述了清单本身。 下表显示了 "清单说明" 部分中 assemblyIdentity 元素设置的属性。

属性 说明
版本 清单的版本。 版本的格式必须为 "主要版本. 次要版本. 内部版本. (,即 n. n. n,其中 n <= 65535) "。
processorArchitecture 为其开发应用程序的处理器。
name 包括公司名称、产品名称和应用程序名称。
类型 应用程序的类型,如 Win32。

示例清单还提供了应用程序的说明,并指定了应用程序依赖项。 下表显示了依赖项部分中 assemblyIdentity 元素设置的属性。

属性 说明
type 依赖项组件的类型,如 Win32。
name 组件的名称。
版本 组件的版本。
processorArchitecture 组件适用的处理器。
publicKeyToken 与此组件一起使用的密钥标记。
语言 组件的语言。

下面是清单文件的一个示例。

重要

如果你的应用程序以32位 Windows 平台为目标,则将 processorArchitecture 项设置为 "X86" ; 如果你的应用程序面向64位 Windows 平台,则将设置为 "amd64" 。 你还可以指定 " * ",这可确保所有平台的目标,如下面的示例中所示。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

如果使用 Microsoft Visual C++ 2005 或更高版本,则可以将以下编译器指令添加到源代码,而不是手动创建清单。 为方便起见,该指令分为多行。

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

以下主题介绍将视觉样式应用于不同类型的应用程序的步骤。 请注意,在每种情况下,清单格式是相同的。

在仅使用标准扩展的应用程序中使用 ComCtl32.dll 版本6

下面是不使用第三方扩展的应用程序的示例。

  • 计算器
  • Windows Vista 和 Windows 7 中的空当接龙 ()
  • Windows Vista 和 Windows 7 中的扫雷 ()
  • 记事本
  • Windows Vista 和 Windows 7 中的纸牌 ()

创建清单并使应用程序能够使用视觉样式。

  1. 链接到 Comctl32.dll 并调用 InitCommonControls

  2. 向具有 XML 清单格式的源树添加一个名为 YourApp.exe 的文件。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. 将清单添加到应用程序的资源文件中,如下所示:

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
    

    备注

    将上一个条目添加到资源时,必须将其设置为一行格式。 或者,您可以将 XML 清单文件放在与应用程序的可执行文件相同的目录中。 操作系统将首先从文件系统加载清单,然后检查可执行文件的资源部分。 文件系统版本优先。

生成应用程序时,会将该清单添加为二进制资源。

使用控制面板中的 Comctl32.dll 版本6或 RunDll32.exe 运行的 DLL

创建清单并使应用程序能够使用视觉样式。

  1. 链接到 Comctl32.dll 并调用 InitCommonControls

  2. 向具有 XML 清单格式的源树添加一个名为 YourApp.cpl 的文件。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. 将清单作为资源 ID 123 添加到应用程序的资源文件中。

备注

创作 "控制面板" 应用程序时,将其置于适当的类别。 控制面板现在支持对控制面板应用程序进行分类。 这意味着可以为 "控制面板" 应用程序分配标识符,并将其分为任务区域,如 "添加或删除程序"、"外观和主题"、"日期"、"时间"、"语言" 和 "区域选项"。

向扩展插件、插件、MMC 管理单元或引入进程的 DLL 添加视觉样式支持

支持视觉样式的操作可以添加到扩展插件、插件、MMC 管理单元或添加到进程中的 DLL。 例如,使用以下步骤为 Microsoft 管理控制台 (MMC) 管理单元添加视觉样式支持。

  1. 在包含 "DISOLATION 感知已启用" 标志的情况下编译管理单元, _ _ 或在 # 包含 "windows .h" 语句之前插入以下语句。

    #define ISOLATION_AWARE_ENABLED 1
    

    有关启用隔离的详细 _ 信息 _ ,请参阅 隔离组件

  2. 在管理单元源中包括公共控制标头文件。

    #include <commctrl.h>
    
  3. 将名为 YourApp 的文件添加到使用 XML 清单格式的源树。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  4. 将清单添加到管理单元的资源文件中。 有关向资源文件添加清单的详细信息,请参阅 在使用扩展、插件或已进入进程的 DLL 的应用程序中使用 Comctl32.dll 版本 6

关闭视觉样式

可以通过调用 SetWindowTheme 函数来关闭窗口的视觉样式或窗口中的所有控件,如下所示:

SetWindowTheme(hwnd, L" ", L" ");

在前面的示例中, hwnd 是要在其中禁用视觉样式的窗口的句柄。 调用后,控件呈现时不显示视觉样式。

对 HTML 内容使用视觉样式

修改 CSS 属性级联样式表 () 属性(如背景或边框)的 HTML 页面不会应用视觉样式。 它们显示指定的 CSS 属性。 当指定为内容的一部分时,大多数 CSS 属性将应用于应用了视觉样式的元素。

默认情况下,视觉样式应用于 Microsoft Internet Explorer 6 及更高版本中显示的页面上的固有 HTML 控件。 若要关闭 HTML 页面的视觉样式,请向 部分。 此方法也适用于打包为 HTML 应用程序 (HTA) 。 若要关闭视觉样式,META 标记必须如下所示:

<META HTTP-EQUIV="MSThemeCompatible" CONTENT="no">

备注

如果浏览器设置和标记设置不一致,则页面将不会应用视觉样式。 例如,如果 META 标记设置为"否",并且浏览器设置为启用视觉样式,则视觉样式将不会应用于页面。 但是,如果浏览器或 META 标记设置为"是",并且未指定其他项,则应用视觉样式。

视觉样式可能会更改内容的布局。 此外,如果在内部 HTML 控件上设置某些属性(例如按钮的宽度)时,你可能会发现按钮上的标签在某些视觉样式下不可读。

必须使用视觉样式全面测试内容,以确定应用视觉样式是否对内容和布局有负面影响。

未应用视觉样式时

若要避免将视觉样式应用于顶级窗口,请为窗口提供一个非 null 区域 (SetWindowRgn) 。 系统假定具有非 NULL 区域的窗口是不使用视觉样式的专用窗口。 与非视觉样式顶级窗口关联的子窗口仍可应用视觉样式,即使父窗口不应用。

如果要禁用对应用程序中所有窗口使用视觉样式,请调用 SetThemeAppProperties, 不要传递 STAP _ ALLOW _ NONCLIENT 标志。 如果应用程序不调用 SetThemeAppProperties, 则假定的标志值为 STAP _ ALLOW _ NONCLIENT | STAP _ ALLOW CONTROLS _ | STAP ALLOW _ _ WEBCONTENT。 假定的值会导致非工作区、控件和 Web 内容应用视觉样式。

使应用程序与早期版本的 Windows

许多视觉样式体系结构旨在简化在不支持更改控件外观的早期版本Windows产品。 为多个操作系统交付应用程序时,请注意以下事项:

  • 在早期版本Windows,Windows 8高对比度时视觉样式关闭。 若要支持高对比度,支持视觉样式的旧应用程序需要提供单独的代码路径,以正确绘制高对比度的 UI 元素。 在Windows 8,高对比度是视觉样式的一部分;但是,Windows 8应用程序 (在其应用程序清单) 的兼容性部分包含 Windows 8 GUID 的应用程序,则仍然需要提供单独的代码路径,以在早期版本的 Windows 7 上正确呈现。
  • 如果使用版本 6 ComCtl32.dll(如磁贴视图或链接控件)中的功能,则必须处理这些控件在用户计算机上不可用的情况。 ComCtl32.dll版本 6 不可再发行。
  • 测试应用程序,确保在不首先检查当前版本的情况下ComCtl32.dll版本 6 的功能。
  • 不要链接到 UxTheme.lib。
  • 当视觉样式未如预期工作时,为 实例编写错误处理代码。
  • 在早期版本中安装应用程序的清单不会影响控件的呈现。

视觉样式