Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WM_DPICHANGED事件表明窗口的新位置不正确_C++_Windows_Winapi_Dpi_Hdpi - Fatal编程技术网

C++ WM_DPICHANGED事件表明窗口的新位置不正确

C++ WM_DPICHANGED事件表明窗口的新位置不正确,c++,windows,winapi,dpi,hdpi,C++,Windows,Winapi,Dpi,Hdpi,我有两台显示器连接到我的桌面。左侧的3840x2160主监视器设置为150%缩放(144 DPI),右侧的1920x1080监视器设置为100%缩放(96 DPI)。在底部边缘对齐。这是在Windows 8.1上出现的,但在Windows 10上也会出现同样的问题 < >我的应用程序是使用本地Win32窗口的C++。它设置为每个监视器DPI感知 我有一个对话框窗口,它是一个无边框(也不是标题栏)窗口,在客户端区域内有一个自定义标题栏。用户可以拖动此自定义标题栏来移动窗口,并在内部使用SetWin

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

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

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

当这个窗口从高DPI的左侧监视器拖到右侧的常规监视器时,我会收到一条WM_DPICHANGED消息。窗口的当前矩形为: curRect={LeftTop(35271099)RightBottom(41572098)WidthHeight[630x999]}

WM_DPICHANGED消息给我的新建议RECT是: newRect={LeftTop(35271099)RightBottom(39471765)WidthHeight[420 x 666]}

如果我按照WM_DPICHANGED文档的建议将新的RECT传递给SetWindowPos,那么现在在我的高DPI监视器上会认为该窗口已恢复,在SetWindowPos()中,我会收到另一条WM_DPICHANGED消息,告诉我再次更改窗口位置/大小。这发生在原始WM_DPICHANGED事件返回之前

基于新建议的矩形,这是有意义的,因为左边缘没有移动,但宽度正在减小。 如果我使用的是实际的非客户端标题栏,那么同一窗口的WM_DPICHANGED消息就没有这个问题。左边缘在新建议的矩形中移动

对如何处理这个问题有什么建议吗?任何最小化更改新建议矩形的方法,以确保窗口w/h符合建议,但它的位置使其不会触发另一个DPICHANGED事件(保留在新监视器上)


谢谢

对我来说,这听起来像个Windows bug。为什么你不能把你的自定义标题栏放在客户端区域之外?看看有两种方法让Windows处理窗口拖动,这可能会修复你的问题。@安德斯,UI是用户构建的,它们可以潜在地将UI的任何部分标记为窗口的可拖动部分,甚至在UI的中间。所以我认为这不管用。此外,UI是用OpenGL绘制的,我认为这对于绘制非客户端区域来说不太合适。谢谢你的建议。@JonathanPotter,这很有帮助,它确实解决了这个问题,让Windows重新定位,而不是我们自己手动定位。我会更深入地研究这个问题。谢谢@mb13您是否解决过此问题?