高对比度模式

平台

客户端 - Windows 8
服务器 - Windows Server 2012

说明

在以前的 Windows 操作系统中,高对比度模式仅限于在经典主题下运行的主题,这些主题没有视觉样式。 在 Windows 8 和 Windows Server 2012 中,经典模式已删除,并替换为具有视觉样式的高对比度主题。 此更改main好处之一是删除在经典模式下运行的应用的单独代码路径。

开发人员仍然需要接受高对比度模式如何影响其应用以及如何开发真正与风格无关的应用的教育。 这一点很重要,因为主题颜色的错误使用或假设可能会导致应用在视觉样式(如 Aero)下正确运行,但这些相同的应用在高对比度下响应不正确。 例如,在 Aero 中,文本始终为黑色,突出显示颜色为浅蓝色。 但是,在高对比度黑色中,突出显示颜色为黑色。 如果假定为黑色文本,就像Windows 8之前的许多内置应用中一样,并使用系统默认值进行突出显示,则用户将在黑色背景上看到黑色文本。 在这些情况下,必须了解如何正确使用主题和系统指标,以便应用在各个样式之间看起来正确。

表现

  • 在应用清单中不包含 Windows 8 <supportedOS> 标记的应用的工作区中,未启用主题设置。 因此,应用必须使用在经典主题的高对比度模式下呈现所需的代码路径来呈现工作区。
  • 在高对比度主题的应用的非客户端和工作区中均未启用主题设置。 如果应用清单中不包含 Windows 8 <supportedOS> 标记,并且使用 DwnIsCompositionEnabled () API 在窗口的非工作区中绘图,则也不启用此功能。 整个应用以经典主题的高对比度模式呈现。
  • 如果应用在其清单中添加了对Windows 8的支持,但不使用视觉样式进行呈现(即,在应用中对颜色或图像进行硬编码),可能无法在高对比度主题中正确呈现。 文本可能难以阅读,或者图像可能不会像在高对比度模式下那样显示。

缓解措施

高对比度主题中的文本颜色已编写为符合 Microsoft 辅助功能指南。 前景和背景之间的高对比度为 14:1。 如果默认启用的颜色不适合特定最终用户,则可以通过这些高对比度主题中的“窗口颜色”控制面板设置轻松自定义这些颜色。

这些 UI 组件在高对比度主题中可自定义:

  • 窗口背景色
  • 文本颜色
  • 超链接颜色
  • 禁用的文本
  • 所选文本的前景色和背景色
  • 活动窗口标题的前景色和背景色
  • 非活动窗口标题的前景色和背景色
  • 按钮前景色和背景色

解决方案

如果在高对比度主题的应用中出现意外行为,以下解决方案之一可能会有所帮助:

  • 为Windows 8清单应用:

    应用清单中不包含 Windows 8 <supportedOS> 标记的应用将呈现其工作区,而没有主题。 内置应用都应在应用清单中包含此条目。 为Windows 8添加 4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38 GUID 值。

  • 将视觉样式与所有者绘制的 UI 配合使用:

    所有者绘制的控件应按照 MSDN 上的说明正确呈现控件部件和状态,包括文本。 开发人员不应依赖设备上下文中指定的文本或背景色来使用非 UxTheme 方法进行呈现。 如果相关控件没有主题部件,请使用具有 相应指标 的 GetThemeSysColor,并使用标准 GDI 方法绘制文本。 如果任何 UxTheme 调用都不合适,请使用 GetSysColor 方法获取适当的指标。

  • 选择文本颜色:

    请勿使用硬编码的文本颜色,即使假定它在所有常见方案中看起来都不错。 发货主题的创建方式是支持关联指标的高可见性。 例如,COLOR_HIGHLIGHTTEXT应与COLOR_HIGHLIGHT作为背景使用,COLOR_WINDOWTEXT应与COLOR_WINDOW作为背景一起使用。 如果这些关联存在例外情况,请在主题部分和状态定义本身而不是代码中使用它们。 设计高对比度 UI 时,UI 必须与当前应用的高对比度主题无关,因为高对比度用户可以自定义其颜色。

  • 响应WM_ThemeChange事件:

    如果应用缓存从主题检索到的颜色或以非标准方式应用颜色,请为WM_THEMECHANGE添加消息处理程序,以便重新计算存储的颜色值并重新绘制 UI。

  • 编写高对比度 WWA 应用:

    Web 应用无权访问 UxTheme API,但仍应使用当前系统指标作为 UI 的基础进行编写。 WWA 开发人员可以利用一些资源来确保符合高对比度的应用:

    • W3C CSS 颜色规范指定了使用系统指标而不是特定颜色的语法
    • Internet Explorer 10 中添加了对高对比度媒体查询的支持
    • WWA 可以利用 IAccessibilityCapabilities::get_HighContrast () 方法检查高对比度状态

    Windows 应用商店应用与经典 Windows 应用程序中存在的主题部件没有许多相同的问题,但你仍然需要确保高对比度合规性。 默认情况下,Internet Explorer 会忽略某些用户定义的样式,并将其替换为高对比度兼容值。 例如,将忽略背景图像、背景和颜色 CSS 属性。

    如果你不希望 Internet Explorer 忽略你设置的任何属性,并且你已确保 UI 符合高对比度,则可以在父元素上设置新的 M3 CSS 属性 –ms-high-contrast: off。

  • 编写高对比度 Windows 应用商店应用:

    Windows 应用商店应用应使用 SystemColors 类来确定正确的 UI 元素着色,请记住某些系统指标颜色设计为结合使用,例如 SystemColors.WindowColor 和 SystemColors.WindowTextColor。 这有利于提供卓越的高对比度体验。

  • 在以前版本的 Windows 中正确检测高对比度:

    在以前版本的 Windows 上运行的应用无权访问新的高对比度主题,即使清单指定与相关 Windows 版本的兼容性也是如此。 因此,可能需要插入其他代码路径,以在以前版本的 Windows 中使用的经典环境中处理呈现。 在这种情况下,应通过使用 SPI_GETHIGHCONTRAST 标志调用 SystemParametersInfo 函数来检查是否存在高对比度。 这是检查是否存在高对比度的唯一受支持的方法。

测试

测试应用时,请确保它在Windows 8提供的所有内置主题中正确呈现:Aero、基本、高对比度 1、高对比度 2、高对比度黑色和高对比度白色。 确保文本在高对比度主题中清晰可见且易于阅读。

资源