【问题标题】:MoveWindow does not scale the window when moving to a different screen移动到不同屏幕时,MoveWindow 不会缩放窗口
【发布时间】:2021-11-18 11:17:09
【问题描述】:

我有一个带有浮动窗口的 Windows 应用程序。我在多显示器设置(FHD、4K)上运行它。该应用程序被标记为系统感知,因此我们选择主监视器的当前 DPI 值并根据该值进行缩放。之后,操作系统位图对其进行缩放。该应用程序在 Windows 10 上运行。

现在,当一个浮动窗口被拖到另一个显示器上时,操作系统会自动对其进行位图缩放,一切正常。

问题是我们有一些没有标题栏的窗口,我们有代码通过从窗口的客户区拖动来移动这些窗口。当鼠标松开时,我们调用MoveWindow() API 将窗口移动到目标位置。这在单个监视器上工作正常,但是当我们将窗口放在不同的监视器上时,它不会位图缩放,它似乎丢失了它的放置位置。操作系统似乎只在我们通过标题栏拖动窗口时才进行位图缩放,而不是在以编程方式移动它时。

关于在以编程方式移动窗口时如何实现这种自动缩放的任何想法?

【问题讨论】:

  • 为什么不在没有标题栏的窗口上处理WM_NCHITTEST,返回HTCAPTION,让系统处理其他所有事情?
  • 这些浮动窗口实际上是使用无标题窗口创建的定制可停靠工具栏。跟踪鼠标移动以查看它是否会停靠在当前位置。它所有现有的旧代码,我试图弄清楚为什么手动拖动会缩放窗口但 MoveWindow 不会。
  • 即使处理WM_NCHITTEST,窗口也不会缩放。我看到的唯一改进是它不会奇怪地跳转到不同的位置。我之前曾尝试在WM_LBUTTONDOWN 上模拟WM_NCLBUTTONDOWN,它模拟了拖动,但窗口在移动到另一个屏幕时仍然没有缩放
  • 让操作系统为您拖动无标题窗口的另一种方法是使用未记录但众所周知的SC_DRAGMOVE (0xF012) 命令向窗口发送WM_SYSCOMMAND 消息。
  • 保证asked for PMv2

标签: c++ winapi scaling multiple-monitors movewindow


【解决方案1】:

所以这取决于窗口是如何创建的。我通过使用WS_CAPTION 样式创建窗口并稍后删除该样式来修复它。我不确定它在内部做了什么,但现在当它通过鼠标拖动或使用诸如MoveWindow 之类的 API 移动到另一个屏幕时,它可以正确缩放。

::CreateWindowEx(WS_EX_PALETTEWINDOW,...,..., WS_POPUP | WS_CAPTION,...);
::SetWindowLong(hWnd, GWL_STYLE, ::GetWindowLong(hWnd, GWL_STYLE) & ~WS_CAPTION);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2019-08-13
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多