Direct2D 和高 DPI

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

Direct2D 中的高 DPI 支持

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

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

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

Windows 8和高 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。

 

如何确保应用程序在高 DPI 显示器上正确显示