彻底搞懂 Windows 显示器 DPI 及其相关功能(二、缩放比例感知介绍)

目录

一、前言

二、DPI感知枚举

三、备注

四、如何理解,举例说明


一、前言

               系列文章:

  1. 彻底搞懂 Windows 显示器 DPI 及其相关功能(一、高分辨率介绍)
  2. 彻底搞懂 Windows 显示器 DPI 及其相关功能(二、缩放比例感知介绍)
  3. 彻底搞懂 Windows 显示器 DPI 及其相关功能(三、Delphi 如何适用)
  4. Delphi 程序例子(自动感知及显示器相关功能演示)

二、DPI感知枚举

        确定每英寸点数 (dpi) 感知值。DPI 感知值表示应用程序为 DPI 执行的缩放工作与系统执行的缩放工作的对比。

        用户可以在各自的显示器上设置独立的 DPI 比例因子。某些传统应用程序无法根据多种 DPI 设置调整缩放比例。为了让用户在使用这些应用程序时不会出现显示内容过大或过小的情况,Windows 可以对应用程序应用 DPI 虚拟化,使系统自动缩放以匹配当前显示屏的 DPI。PROCESS_DPI_AWARENESS 值表示应用程序自行处理的缩放程度,以及 Windows 提供的缩放程度。请注意,由系统缩放的应用程序可能会显得模糊,并且会读取显示器的虚拟化数据以保持兼容性。

PROCESS_DPI_UNAWARE
Value: 0
        非感知DPI。应用程序不会根据 DPI 的变化进行缩放,并始终假定缩放系数为 100% (96 DPI)。在任何其他 DPI 设置下,系统都会自动缩放。
PROCESS_SYSTEM_DPI_AWARE
Value: 1
        支持系统 DPI。应用程序不会根据 DPI 的变化进行缩放。它会查询一次 DPI,并在应用程序的整个生命周期中使用该值。如果 DPI 发生变化,应用程序不会根据新的 DPI 值进行调整。当 DPI 与系统值相比发生变化时,系统会自动放大或缩小该应用。
PROCESS_PER_MONITOR_DPI_AWARE
Value: 2
        支持每个显示器的 DPI。此应用程序在创建时会检查 DPI,并在 DPI 发生变化时调整缩放因子。系统不会自动缩放这些应用程序。

三、备注

重要事项  
        以前的 Windows 版本要求您为整个应用程序设置 DPI 识别。现在,DPI 识别与单个线程、进程或窗口绑定。这意味着 DPI 感知可以在应用程序运行时更改,多个窗口可以拥有各自独立的 DPI 感知值。请参阅 DPI_AWARENESS,了解有关 DPI 感知当前工作方式的更多信息。以下关于在应用程序清单中设置 DPI 感知的建议仍受支持,但目前的建议是使用 DPI_AWARENESS_CONTEXT。

        应用程序的 DPI 感知应通过应用程序清单进行设置,以便在执行任何依赖于系统 DPI 的操作前确定 DPI 感知。或者,您也可以使用 SetProcessDpiAwareness设置 DPI 感知,但如果这样做,您需要确保在执行任何依赖于系统 DPI 的操作前设置 DPI 感知。一旦为进程设置了 DPI 感知,就无法更改。

提示  
        如果您的应用程序是 PROCESS_DPI_UNAWARE,则无需在应用程序清单(manifest)中设置任何值。PROCESS_DPI_UNAWARE 是应用程序的默认值,除非指定了其他值。

        PROCESS_DPI_UNAWARE 和 PROCESS_SYSTEM_DPI_AWARE 应用程序无需响应 WM_DPICHANGED,也无需处理 DPI 的变化。当 DPI 发生变化时,系统会根据需要自动放大或缩小这些类型的应用程序。PROCESS_PER_MONITOR_DPI_AWARE 应用程序负责识别和响应由 WM_DPICHANGED发出信号的 DPI 变化。系统不会对其进行缩放。如果这种类型的应用程序不调整窗口及其内容的大小,那么当窗口从一个显示屏移动到另一个具有不同 DPI 设置的显示屏时,它就会随着相对 DPI 的变化而增大或缩小。

提示  
        在以前的 Windows 版本中,没有 PROCESS_PER_MONITOR_DPI_AWARE 设置。应用程序要么未感知 DPI,要么感知 DPI。在 Windows 8.1 之前被归类为 DPI 感知的传统应用程序,在当前版本的 Windows 中被视为具有 PROCESS_SYSTEM_DPI_AWARE 的 PROCESS_DPI_AWARENESS 设置。

四、如何理解,举例说明

        要了解不同 DPI 感知值的重要性和影响,请考虑一个拥有三台显示器的用户: 显示器 A 设置为 100% 缩放因子(96 DPI),显示器 B 设置为 200% 缩放因子(192 DPI),显示器 C 设置为 300% 缩放因子(288 DPI)。系统 DPI 设置为 200%

        PROCESS_DPI_UNAWARE 应用程序将始终使用 100% 的缩放因子(96 DPI)。在这种情况下,创建的 PROCESS_DPI_UNAWARE 窗口大小为 500 x 500。在显示屏 A 上,该窗口将以不缩放的方式进行本地渲染。在 B 和 C 显示器上,系统将分别自动将其放大 2 倍和 3 倍。这是因为 PROCESS_DPI_UNAWARE 总是假定 DPI 为 96,而系统会考虑到这一点。如果应用程序查询窗口大小,无论它在哪个显示屏上,都会得到一个 500 乘 500 的值。如果该程序询问三台显示器中任何一台的 DPI,都将得到 96。

        现在考虑一个 PROCESS_SYSTEM_DPI_AWARE 的应用程序。请记住,在示例中,系统 DPI 为 200% 或 192 DPI。这意味着此应用程序创建的任何窗口都将在显示屏 B 上以本地方式呈现。如果窗口移动到显示屏 A,它将自动缩小 2 倍。它在启动时查询 DPI,然后就不再更改。同样,如果窗口移动到显示屏 C,系统会自动将其放大 1.5 倍。如果应用程序询问窗口大小,它将始终得到相同的值,这与 PROCESS_DPI_UNAWARE 类似。如果询问三台显示器中任何一台的 DPI,则会得到 192。

        与其他感知值不同,PROCESS_PER_MONITOR_DPI_AWARE 应适应其所在的显示屏。这意味着它始终以本地方式呈现,而不会被系统缩放。应用程序有责任在收到 WM_DPICHANGED消息时调整缩放系数。该消息的部分内容包括窗口的建议矩形。该建议是将当前窗口从旧的 DPI 值缩放至新的 DPI 值。例如,一个窗口在 A 显示屏上的尺寸是 500 x 500,如果移动到 B 显示屏,就会收到一个 1000 x 1000 的建议窗口矩形。如果将同一窗口移动到显示屏 C,则 WM_DPICHANGED 的建议窗口矩形将为 1500 x 1500。此外,当该应用程序查询窗口大小时,它将始终获得实际的本地值。同样,如果它询问三个显示器中任何一个的 DPI,将分别得到 96、192 和 288。

        由于 DPI 虚拟化的存在,如果一个应用程序向另一个具有不同感知级别的应用程序查询 DPI 相关信息,系统会自动缩放数值以匹配调用者的感知级别。其中一个例子是,如果您调用 GetWindowRect 并传入另一个应用程序创建的窗口。在上述情况下,假设 PROCESS_DPI_UNAWARE 应用程序在显示屏 C 上创建了一个 500 x 500 的窗口。如果您从其他应用程序中查询窗口矩形,矩形的大小将根据您的应用程序的 DPI 感知级别而有所不同。

PROCESS_DPI_UNAWARE您将得到一个 500 x 500 的矩形,因为系统会假定 DPI 为 96,并自动将实际矩形的比例缩小 3 倍。
PROCESS_SYSTEM_DPI_AWARE您将得到一个 1000 x 1000 的矩形,因为系统会假定 DPI 为 192,并自动将实际矩形的比例缩小 3/2。
PROCESS_PER_MONITOR_DPI_AWARE您将获得 1500 x 1500 的矩形,因为系统将使用显示器的实际 DPI,而不会在幕后进行任何缩放。

本节完。下一节:彻底搞懂 Windows 显示器 DPI 及其相关功能(三、Delphi 如何适用)

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
显示器稿dpi缩放替代设置是一种在双显示器设置中可以提高可视化体验的方法。正常情况下,当我们使用显示器时,两个显示器的分辨率和dpi可能不一致,这会导致显示器上的内容大小不一致,不协调,影响用户的使用体验。为了解决这个问题,可以使用显示器稿dpi缩放替代设置。 双显示器稿dpi缩放替代设置的核心思想是通过调整显示器上的dpi设置,使得两个显示器上的内容在大小上能够保持一致。具体操作可以通过以下步骤完成: 第一步,打开系统设置并选择显示选项。在显示选项中,可以找到显示器dpi设置选项。在这里,我们可以手动调整两个显示器dpi值,使得它们保持一致。 第步,根据实际情况进行调整。根据双显示器的分辨率和大小差异,我们需要手动调整每个显示器dpi值。通常情况下,我们可以将dpi设置为较高的值,使得显示器上的内容看起来更加清晰和锐利。 第三步,进行测试和调整。在调整完dpi设置后,我们需要进行测试,查看显示器上的内容是否大小一致。如果不一致,我们可以再次进行调整,直到达到我们想要的效果。 通过双显示器稿dpi缩放替代设置,我们可以使得双显示器的内容在大小上保持一致,提高用户的可视化体验。这种方法可以适用于各种双显示器的设置,无论是在工作环境还是在娱乐环境中,都能够提升我们的使用效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值