Direct2D 和 High-DPI

编写 DPI 感知应用程序是使用户界面(UI)在各种高 DPI 显示设置中一致外观的关键。 无法识别 DPI 但正在高 DPI 显示设置上运行的应用程序可能会受到许多视觉项目的影响,包括 UI 元素的缩放不正确、剪裁的文本和模糊图像。 通过在应用程序中添加 DPI 感知支持,可以更可预测的方式呈现应用程序的 UI,使其更具视觉吸引力,更易于用户阅读。 幸运的是,Direct2D 使编写在高 DPI 中运行良好的应用程序比以往更容易。 本主题包含以下部分。

Direct2D 中的 High-DPI 支持

Direct2D 提供以下功能,用于处理高 DPI 方案:

  • 只要应用程序清单指示应用程序正确处理 DPI,它就会在创建窗口呈现目标时自动遵循系统 DPI。 (有关如何声明应用程序是 DPI 感知的信息,请参阅 如何确保应用程序在 High-DPI 显示上正确显示。
  • 它以 DIP(设备无关像素)表示坐标,这样应用程序就可以在 DPI 设置更改时自动缩放。
  • 它允许位图具有 DPI,并考虑到 DPI 来正确缩放它们。 此功能还可用于维护不同分辨率的图标。
  • 它以 DIP 表示大多数资源,这使得资源自动独立于解析。
  • 它使用浮点坐标空间和抗锯齿,因此任何内容都可以缩放到任何任意 DPI。

Direct2D 图形管道旨在从 96 DPI 缩放到 1200DPI。

Windows 8 和 High-DPI

从 Windows 8 开始,高 DPI 支持还有其他功能。

如果设备上下文 DPI 足够高,Direct2D 会更改用于启用文本垂直抗锯齿的阈值。 这会导致在高 DPI 显示器上更快地呈现文本。 此外,还可以使用 ID2D1DeviceContext::SetUnitMode 方法将单位模式切换到像素而不是 DIP。 如果将单位模式设置为像素,并将设备上下文 DPI 设置为屏幕 DPI,则仍启用优化。

什么是 DIP?

独立于设备的像素(DIP)是一个逻辑像素,它通过标量 DPI 映射到物理设备的像素。 DPI 表示每英寸点,其中点表示物理设备像素。 (名词来自打印,其中点是打印过程可以生产的最小墨点)。 由于标准监视器用于每英寸 96 点,因此 DPI 为 96 意味着设备独立像素(或 DIP)使用物理像素映射 1:1。 例如,如果 DPI 为 96*2 = 192,则单个 DIP 将包含两个物理像素。

应用程序不一定正确处理此缩放的原因有很多;最简单的原因之一是,在呈现时需要额外的工作来发现和使用此标量值。 在 Direct2D 中,默认情况下应用缩放。 由于此映射,物理设备像素最终可能以小数 DIP 坐标结尾,这是 Direct2D 使用浮点坐标空间的原因之一。

物理像素 = (dip × DPI) / 96

若要将物理像素转换为 DIP,请使用以下公式:

dip = (物理像素× 96) / DPI

注意

从 Windows 8 开始,可以使用 ID2D1DeviceContext::SetUnitMode 方法将单元模式切换为像素而不是 DIP。

 

如何确保应用程序在 High-DPI 显示 上正确显示