启用视觉样式

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

本主题包含以下各节。

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

若要使应用程序能够使用视觉样式,必须使用 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.manifest。 以下示例清单显示第一部分描述清单本身。 下表显示清单说明部分中 assemblyIdentity 元素设置的属性。

Attribute 说明
版本 清单的版本。 版本必须采用 major.minor.revision.build 格式(即 n.n.n.n,其中 n <=65535)。
processorArchitecture 为其开发应用程序的处理器。
name 包括公司名称、产品名称和应用程序名称。
type 应用程序的类型,例如 Win32。

 

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

Attribute 说明
type 依赖项组件的类型,例如 Win32。
name 组件的名称。
版本 组件的版本。
processorArchitecture 为其设计组件的处理器。
publicKeyToken 用于此组件的密钥令牌。
language 组件的语言。

 

下面是清单文件的示例。

重要

如果应用程序面向 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

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

  • 计算器
  • FreeCell(在 Windows Vista 和 Windows 7 中)
  • Minesweeper(在 Windows Vista 和 Windows 7 中)
  • 记事本
  • Solitaire(在 Windows Vista 和 Windows 7 中)

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

  1. 链接到 ComCtl32.lib 并调用 InitCommonControls

  2. 将名为 YourApp.exe.manifest 的文件添加到具有 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>
    
  3. 将清单添加到应用程序的资源文件中,如下所示:

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
    

    注意

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

     

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

在控制面板中使用 ComCtl32 版本 6 或由 RunDll32.exe 运行的 DLL

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

  1. 链接到 ComCtl32.lib 并调用 InitCommonControls

  2. 将名为 YourApp.cpl.manifest 的文件添加到具有 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>
    
  3. 将清单作为资源 ID 123 添加到应用程序的资源文件中。

注意

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

 

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

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

  1. 使用 -DISOLATION_AWARE_ENABLED 标志编译管理单元,或在 #include “windows.h”语句之前插入以下语句。

    #define ISOLATION_AWARE_ENABLED 1
    

    有关 ISOLATION_AWARE_ENABLED 的详细信息,请参阅隔离组件

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

    #include <commctrl.h>
    
  3. 将名为 YourApp.manifest 的文件添加到使用 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 版本 6

关闭视觉样式

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

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

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

将视觉样式与 HTML 内容配合使用

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

默认情况下,视觉样式应用于 Microsoft Internet Explorer 6 及更高版本中显示的页面上的内部 HTML 控件。 若要关闭 HTML 页面的视觉样式,请将 META 标记添加到 <head> 分区。 此方法也适用于打包为 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 8 之前的 Windows 版本中,当高对比度处于打开状态时,视觉样式将关闭。 为了支持高对比度,支持视觉样式的旧应用程序需要提供单独的代码路径来正确绘制高对比度的 UI 元素。 在 Windows 8 中,高对比度是视觉样式的一部分;但是,Windows 8 应用程序(在应用程序清单的兼容性部分中包括 Windows 8 GUID)仍需要提供单独的代码路径,以在 Windows 7 和更早版本上以高对比度正确呈现。
  • 如果使用 ComCtl32.dll 版本 6 中的功能(如磁贴视图或链接控件),则必须处理这些控件在用户计算机上不可用的情况。 ComCtl32.dll 版本 6 不可再发行。
  • 测试应用程序,确保不依赖于 ComCtl32.dll 版本 6 的功能,且无需对当前版本进行首次检查。
  • 请勿链接到 UxTheme.lib。
  • 当视觉样式无法按预期工作时,为实例编写错误处理代码。
  • 在早期版本中安装应用程序的清单不会影响控件的呈现。

视觉样式