WM_DPICHANGED事件表明窗口的新位置不好

时间:2017-03-17 21:52:17

标签: c++ windows winapi dpi hdpi

我有两个显示器连接到我的桌面。左侧的3840x2160主监视器设置为150%缩放(144 DPI),右侧的1920x1080监视器设置为100%缩放(96 DPI)。它们在底部边缘对齐。这是在Windows 8.1上,但在Windows 10上也会出现同样的问题。

我的应用程序是使用本机Win32窗口的C ++。它设置为每个监视器DPI感知。

我有一个对话框窗口,它是一个无边框(不是标题栏)窗口,在客户区内有一个自定义标题栏。用户可以拖动此自定义标题栏以移动窗口,并在内部使用SetWindowPos()移动它。

当此窗口从High-DPI左侧监视器拖动到右侧的常规监视器时,我收到WM_DPICHANGED消息。窗口的当前RECT是: curRect = {LeftTop(3527,1099)RightBottom(4157,2098)WidthHeight [630 x 999]}

WM_DPICHANGED消息给出的新建议的RECT是: newRect = {LeftTop(3527,1099)RightBottom(3947,1765)WidthHeight [420 x 666]}

如果我将新的RECT传递给SetWindowPos作为WM_DPICHANGED的文档建议,那么现在我的高DPI监视器上的窗口被认为是,并且在SetWindowPos()中我得到另一个WM_DPICHANGED消息告诉我更改窗口pos /大小。这发生在我原来的WM_DPICHANGED事件返回之前。

这基于新建议的RECT是有意义的,因为左边缘没有移动,但宽度正在减小。 如果我使用实际的非客户端标题栏,则同一窗口的WM_DPICHANGED消息不会出现此问题。左边缘在新建议的RECT中移动。

有关如何处理此问题的任何建议?任何最小化改变新建议RECT的方法,以确保窗口w / h符合建议,但它的定位使得它不会触发另一个DPICHANGED事件(停留在新监视器上)。

谢谢!

0 个答案:

没有答案