支持高对比度主题

本主题比较了 Windows 8 和以前版本的 Windows 对高对比度主题的支持,并介绍了如何在 Windows 8 应用程序中支持高对比度主题。

包括以下几部分。

高对比度主题支持概述

Windows 7 及更早版本支持两种主题模式,包括传统的 Windows 经典模式和最新的视觉样式。 Windows 7 保留了 Windows 经典模式,主要是为了支持各种高对比度主题。 不过,Windows 经典模式也有许多缺点:

  • 不支持采用 Windows Aero 等视觉样式的主题。 高对比度主题的用户必须使用 Windows 经典用户界面。
  • 不支持依赖桌面窗口管理器 (DWM) 运行的用户界面功能,如缩略图预览和 Windows 7 中引入的全屏放大镜。
  • 开发人员必须维护两个独立的代码路径,方可支持两种不同的主题模式。

在 Windows 8 及更高版本中,主题模式的以下更改消除了之前的缺点:

  • 不再支持 Windows 经典主题模式,开发人员只用为仅针对 Windows 8 的应用程序维护一个代码路径即可。
  • 由于 Windows 8 采用了视觉样式和 DWM,因此高对比度用户可以使用缩略图预览和全屏放大镜等功能。
  • 视觉样式支持设置各种用户界面元素的颜色,让高对比度用户能够自定义用户界面,从而满足个人需求和偏好。
  • Windows 8 包含对现有应用程序的兼容性支持,这些应用程序在设计时采用了基于 Windows 经典主题模式的高对比度主题。

在 Windows 8 及更高版本中支持高对比度主题

在 Windows 8 中,由于视觉样式是在高对比度模式下启用的,因此只要遵守以下准则,即可轻松支持高对比度主题。

  • 字体和控件大小。 为确保残障用户可以访问用户界面,请根据当前主题设置来设置字体大小。 将控件的大小至少设置为默认大小。
  • 颜色。 避免使用硬编码颜色。 请改为使用系统颜色,因为它们是基于当前主题的。 使用自定义颜色会干扰和覆盖高对比度主题中的颜色。
  • 应用程序清单。 设计用于新的高对比度主题的应用程序应在其清单中定义应用程序兼容性部分,其中包含 Windows 8 兼容性 GUID。 否则,Windows 假定应用程序是专为较旧版本的 Windows 设计的,并通过模拟 Windows 经典主题模型来呈现应用程序用户界面。

将兼容性部分添加到应用程序列表中

应用程序清单是一个 XML 文件,用于描述应用程序的要求。 清单的兼容性部分标识了应用程序支持的 Windows 版本。 兼容性部分使用以下 GUID 来标识不同的 Windows 版本。

版本 GUID
Windows Vista {e2011457-1546-43c5-a5fe-008deee3d3f0}
Windows 7 {35138b9a-5d96-4fbd-8e2d-a2440225f93a}
Windows 8 {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}

 

兼容性部分可以指定多个 Windows 版本,但每个版本都必须包含在自己的 <supportedOS/> 标记中。 以下示例显示了在兼容性部分中指定 Windows 7 和 Windows 8 的应用程序清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!--The ID below indicates application support for Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>

            <!--The ID below indicates application support for Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        </application>
    </compatibility>
</assembly>

如果应用程序没有兼容性清单,则会假定其为 Windows Vista 应用程序,并且在启用高对比度主题时,不会在客户区使用主题控件。 此外,某些视觉样式函数的行为也会受到影响。 例如,IsThemeActiveIsCompositionActiveIsAppThemed 返回 FALSE,而 OpenThemeDataOpenThemeDataEx 返回一个 NULL 句柄。 这是为了支持兼容性,以便在 Windows 8 之前构建的应用程序仍能以与 Windows 旧版本的高对比度模式相同的外观来呈现其用户界面,因为旧版本中没有视觉样式。

在 Windows 8 中,应用程序仍可获得桌面合成的优势。 例如,这意味着全屏放大镜等使用性应用程序不会依赖于单个应用程序的清单状态。 使用性应用程序会继续在高对比度模式下运行,而该应用程序在其清单中并未将自己标识为与 Windows 8 兼容。

下图显示了 Windows 7 上高对比度的简单对话框。

hig contrast dialog box

此图显示了 Windows 8 上高对比度的相同对话框,但在应用程序清单中指定了 Windows 7 兼容性:

w8 high contrast dialog box

此图显示了 Windows 8 上高对比度的相同对话框,并在应用程序清单中指定了 Windows 8:

w8 high contrast dialog with manifest

在以前的 Windows 版本中检测高对比度

在以前版本 Windows 上运行的应用程序无法访问新的高对比度主题。 如果应用程序需要在较早版本上运行,则应在 Windows 经典主题模型中支持高对比度的用户界面呈现。 应用程序可以通过调用带有 SPI_GETHIGHCONTRAST 标记的 SystemParametersInfo 函数来确定高对比度主题是否处于活动状态。

启用视觉样式

视觉样式