每显示器 DPI 感知 MFC MDI 应用程序的问题

问题描述

我正在努力使 MFC 应用程序在具有不同 DPI 缩放比例的多个显示器环境中正确显示。有一个问题我无法解释,当主监视器和辅助监视器以不同的 DPI 运行并且应用程序在辅助监视器上时会发生什么。

如果主显示器具有 100% DPI 缩放比例 (96) 并且辅助显示器具有相同的 100% DPI 缩放比例,则一切正常。

如果主显示器具有 100% DPI 缩放 (96) 并且辅助显示器具有 125% 缩放 (120 DPI) 或 150% 缩放 (144 DPI) 或任何其他更高的值,当子窗口最大化时,部分子窗口系统栏可见,如下所示:

125% 缩放:

enter image description here

150% 缩放:

enter image description here

如果仔细观察,125% 为 7 个像素,150% 为 14 个像素。假设系统栏在 100% 缩放时为 29 像素,在 150% 时为 36 和 125%,而在 150% 时为 43,那么这 7 和 14 个像素分别是 125% 和 150% 时栏大小与 100% 之间的高度差基线。

因此,条形的位置和大小似乎是由系统在主监视器上运行时计算出来的。

当您最大化子窗口时,会向窗口发送一系列 Windows 消息:WM_GETMINMAXINFO > WM_WINDOWPOSCHANGING > WM_GETMINMAXINFO > WM_NCCALSIZE > {{ 1}} > WM_WINDOWSPOSCHANGED > WM_MOVEWM_SIZE 在窗口的大小或位置即将改变时发送,以便应用程序可以覆盖,例如,窗口的认最大化大小和位置。有一个关于此的说明:

对于具有多个显示器的系统,ptMaxSize 和 ptMaxPosition 成员描述窗口的最大化大小和位置 主监视器,即使窗口最终最大化到一个 二级监视器。在这种情况下,窗口管理器会调整这些 值以补偿主监视器和 显示窗口的监视器。因此,如果用户离开 ptMaxSize 不变,显示器上的窗口比主窗口大 显示器最大化到更大显示器的尺寸。

Raymond Chan 有一篇文章对此进行了解释:How does the window manager adjust ptMaxSize and ptMaxPosition for multiple monitors?

因此 WM_GETMINMAXINFO 应填充主监视器的尺寸。我的主显示器是 2560x1440 像素,辅助显示器的大小是 1920x1200。但是,我在这里得到的大小值是 1757x1023 和 1761x1027(在连续调用时)。这既不是主监视器的大小,也不是辅助监视器的大小。

我尝试了一个肮脏的伎俩并处理了 ptMaxSize 消息并将位置(左、上)设置为 0(相对于父级)。

WM_NCCALCSIZE

只要子窗口有焦点就可以正常工作。如果我单击另一个窗口并失去焦点,则该栏会重新绘制并显示在前一个位置。这个技巧只是说明客户区从哪里开始,所以当重新绘制非客户端时,我会回到原来的问题。

我的问题是这个问题的根源是什么,我该如何解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...