diff options
author | Morten Johan Sørvig <morten.sorvig@qt.io> | 2021-09-23 16:28:55 +0200 |
---|---|---|
committer | Morten Johan Sørvig <morten.sorvig@qt.io> | 2021-10-07 14:22:55 +0200 |
commit | cd96d870118d15734a61a019f69ef5f0269bbe05 (patch) | |
tree | b45c9aecd6b33efe781f0398eb38fefef3ab0d91 /src/plugins/platforms/windows/qwindowswindow.cpp | |
parent | 3936648c605ef8eda01780ce8c792bd869b6d33d (diff) |
Move VM_DPICHANGE handling to QWindowsWindow
We want to have as little code in the QWindowsContext
event switch as possible.
Pick-to: 6.2
Change-Id: I04d578aae81c4ee804310a70bd87ee60b2890b6a
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/windows/qwindowswindow.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index bbbf261273..3c64ae1a35 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1833,6 +1833,33 @@ void QWindowsWindow::handleCompositionSettingsChanged() } } +void QWindowsWindow::handleDpiChanged(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + const UINT dpi = HIWORD(wParam); + const qreal scale = qreal(dpi) / qreal(savedDpi()); + setSavedDpi(dpi); + + // Send screen change first, so that the new sceen is set during any following resize + checkForScreenChanged(QWindowsWindow::FromDpiChange); + + // Apply the suggested window geometry to the native window. This will make + // sure the window tracks the mouse cursor during screen change, and also + // that the window size is scaled according to the DPI change. + updateFullFrameMargins(); + const auto prcNewWindow = reinterpret_cast<RECT *>(lParam); + SetWindowPos(hwnd, nullptr, prcNewWindow->left, prcNewWindow->top, + prcNewWindow->right - prcNewWindow->left, + prcNewWindow->bottom - prcNewWindow->top, SWP_NOZORDER | SWP_NOACTIVATE); + + // Scale child QPlatformWindow size. Windows sends WM_DPICHANGE to top-level windows only. + for (QWindow *childWindow : window()->findChildren<QWindow *>()) { + QWindowsWindow *platformChildWindow = static_cast<QWindowsWindow *>(childWindow->handle()); + QRect currentGeometry = platformChildWindow->geometry(); + QRect scaledGeometry = QRect(currentGeometry.topLeft() * scale, currentGeometry.size() * scale); + platformChildWindow->setGeometry(scaledGeometry); + } +} + static QRect normalFrameGeometry(HWND hwnd) { WINDOWPLACEMENT wp; |