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

您所在的位置:网站首页 3d缩放比例是什么意思 彻底搞懂 Windows 显示器 DPI 及其相关功能(二、缩放比例感知介绍)

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

2024-07-14 06:04| 来源: 网络整理| 查看: 265

目录

一、前言

二、DPI感知枚举

三、备注

四、如何理解,举例说明

一、前言

               系列文章:

彻底搞懂 Windows 显示器 DPI 及其相关功能(一、高分辨率介绍)彻底搞懂 Windows 显示器 DPI 及其相关功能(二、缩放比例感知介绍)彻底搞懂 Windows 显示器 DPI 及其相关功能(三、Delphi 如何适用)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 如何适用)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3