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>
This commit is contained in:
parent
3936648c60
commit
cd96d87011
@ -1453,36 +1453,9 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
|
||||
return true;
|
||||
#endif
|
||||
} break;
|
||||
case QtWindows::DpiChangedEvent: {
|
||||
|
||||
const UINT dpi = HIWORD(wParam);
|
||||
const qreal scale = qreal(dpi) / qreal(platformWindow->savedDpi());
|
||||
platformWindow->setSavedDpi(dpi);
|
||||
|
||||
// Send screen change first, so that the new sceen is set during any following resize
|
||||
platformWindow->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.
|
||||
platformWindow->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 : platformWindow->window()->findChildren<QWindow *>()) {
|
||||
QWindowsWindow *platformChildWindow = static_cast<QWindowsWindow *>(childWindow->handle());
|
||||
if (!platformChildWindow)
|
||||
continue;
|
||||
QRect currentGeometry = platformChildWindow->geometry();
|
||||
QRect scaledGeometry = QRect(currentGeometry.topLeft() * scale, currentGeometry.size() * scale);
|
||||
platformChildWindow->setGeometry(scaledGeometry);
|
||||
}
|
||||
|
||||
case QtWindows::DpiChangedEvent:
|
||||
platformWindow->handleDpiChanged(hwnd, wParam, lParam);
|
||||
return true;
|
||||
}
|
||||
#if QT_CONFIG(sessionmanager)
|
||||
case QtWindows::QueryEndSessionApplicationEvent: {
|
||||
QWindowsSessionManager *sessionManager = platformSessionManager();
|
||||
|
@ -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;
|
||||
|
@ -318,6 +318,7 @@ public:
|
||||
void handleResized(int wParam);
|
||||
void handleHidden();
|
||||
void handleCompositionSettingsChanged();
|
||||
void handleDpiChanged(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
static void displayChanged();
|
||||
static void settingsChanged();
|
||||
|
Loading…
Reference in New Issue
Block a user