高对比度模式
平台
客户端 - Windows 8
服务器 - Windows Server 2012
描述
在以前的 Windows作系统中,高对比度模式仅限于在经典主题下运行的主题,这些主题没有视觉样式。 在 Windows 8 和 Windows Server 2012 中,经典模式已删除,并替换为视觉样式的高对比度主题。 此更改的主要好处之一是删除经典模式下运行的应用的单独代码路径。
开发人员仍需要了解高对比度模式如何影响其应用以及如何开发真正与风格无关的应用。 这一点很重要,因为虽然主题颜色的使用不正确或假设会导致应用在视觉样式(如 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 提供的所有现成主题中正确呈现:航空、基本、高对比度 1、高对比度 2、高对比度黑色和高对比度白色。 确保文本在高对比度主题中清晰可见且易于阅读。
资源
- 航空风格课程、部件和国家(新的基本主题和高对比度主题也使用这些状态)
- 所有视觉样式通用的部件和状态
- 将视觉样式与自定义控件和 Owner-Drawn 控件配合使用
- GetSysColor 函数
- W3C CSS 颜色模块级别 3
- SystemColors 类
- SystemParametersInfo 函数
- Microsoft辅助功能