问题描述
我正在努力使 MFC 应用程序在具有不同 DPI 缩放比例的多个显示器环境中正确显示。有一个问题我无法解释,当主监视器和辅助监视器以不同的 DPI 运行并且应用程序在辅助监视器上时会发生什么。
如果主显示器具有 100% DPI 缩放比例 (96) 并且辅助显示器具有相同的 100% DPI 缩放比例,则一切正常。
如果主显示器具有 100% DPI 缩放 (96) 并且辅助显示器具有 125% 缩放 (120 DPI) 或 150% 缩放 (144 DPI) 或任何其他更高的值,当子窗口最大化时,部分子窗口系统栏可见,如下所示:
如果仔细观察,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_MOVE
。 WM_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 (将#修改为@)