启用视觉样式

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

本主题包含以下各节。

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

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

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

应用程序清单使应用程序能够指定它所需的程序集版本。 在 Microsoft Win32 中,程序集是一组 DLL 和包含在这些 DLL 中的可版本对象列表。

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

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

 

示例清单还提供应用程序的说明,并指定应用程序依赖项。 下表显示了 dependency 节中 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) 中的 FreeCell (
  • Windows Vista 和 7 Windows 7) 的扫雷器 (
  • 记事本
  • 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 内容配合使用

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

默认情况下,视觉样式应用于 Microsoft Internet Explorer 6 及更高版本中显示的页面上的内部 HTML 控件。 若要关闭 HTML 页面的视觉样式,请将 META 标记添加到 该节。 此方法也适用于打包为 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。 假定值会导致应用视觉样式的非client 区域、控件和 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。
  • 当视觉样式无法按预期工作时,为实例编写错误处理代码。
  • 在早期版本中安装应用程序的清单不会影响控件的呈现。

视觉样式