From 11e9f1368be986d0e128e8f7b2423d9cc7dd5436 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 22 Mar 2013 11:17:15 +0100 Subject: Windows: Fix reported screen metrics. A call to SetProcessDPIAware() is required in some cases. Task-number: QTBUG-30063 Change-Id: Iba0203d76c8e7068bf9fd4581770c1aca76a4708 Reviewed-by: Joerg Bornemann Reviewed-by: Oliver Wolff --- src/plugins/platforms/windows/qwindowscontext.cpp | 12 ++++++++---- src/plugins/platforms/windows/qwindowscontext.h | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 99ef3aacf3..88c9bf448d 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -172,7 +172,7 @@ QWindowsUser32DLL::QWindowsUser32DLL() : updateLayeredWindowIndirect(0), isHungAppWindow(0), registerTouchWindow(0), unregisterTouchWindow(0), - getTouchInputInfo(0), closeTouchInputHandle(0) + getTouchInputInfo(0), closeTouchInputHandle(0), setProcessDPIAware(0) { } @@ -187,6 +187,7 @@ void QWindowsUser32DLL::init() updateLayeredWindowIndirect = (UpdateLayeredWindowIndirect)(library.resolve("UpdateLayeredWindowIndirect")); isHungAppWindow = (IsHungAppWindow)library.resolve("IsHungAppWindow"); + setProcessDPIAware = (SetProcessDPIAware)library.resolve("SetProcessDPIAware"); } bool QWindowsUser32DLL::initTouch() @@ -252,7 +253,7 @@ struct QWindowsContextPrivate { QSet m_registeredWindowClassNames; HandleBaseWindowHash m_windows; HDC m_displayContext; - const int m_defaultDPI; + int m_defaultDPI; QWindowsKeyMapper m_keyMapper; QWindowsMouseHandler m_mouseHandler; QWindowsMimeConverter m_mimeConverter; @@ -266,8 +267,6 @@ struct QWindowsContextPrivate { QWindowsContextPrivate::QWindowsContextPrivate() : m_systemInfo(0), - m_displayContext(GetDC(0)), - m_defaultDPI(GetDeviceCaps(m_displayContext,LOGPIXELSY)), m_oleInitializeResult(OleInitialize(NULL)), m_eventType(QByteArrayLiteral("windows_generic_MSG")), m_lastActiveWindow(0), m_asyncExpose(0) @@ -276,6 +275,11 @@ QWindowsContextPrivate::QWindowsContextPrivate() : QWindowsContext::user32dll.init(); QWindowsContext::shell32dll.init(); #endif + // Ensure metrics functions report correct data, QTBUG-30063. + if (QWindowsContext::user32dll.setProcessDPIAware) + QWindowsContext::user32dll.setProcessDPIAware(); + m_displayContext = GetDC(0); + m_defaultDPI = GetDeviceCaps(m_displayContext, LOGPIXELSY); const QSysInfo::WinVersion ver = QSysInfo::windowsVersion(); #ifndef Q_OS_WINCE diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index 1fe71e3aff..d60b632beb 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -80,6 +80,7 @@ struct QWindowsUser32DLL const BLENDFUNCTION *, DWORD); typedef BOOL (WINAPI *UpdateLayeredWindowIndirect)(HWND, const UPDATELAYEREDWINDOWINFO *); typedef BOOL (WINAPI *IsHungAppWindow)(HWND); + typedef BOOL (WINAPI *SetProcessDPIAware)(); // Functions missing in Q_CC_GNU stub libraries. SetLayeredWindowAttributes setLayeredWindowAttributes; @@ -94,6 +95,9 @@ struct QWindowsUser32DLL UnregisterTouchWindow unregisterTouchWindow; GetTouchInputInfo getTouchInputInfo; CloseTouchInputHandle closeTouchInputHandle; + + // Windows Vista onwards + SetProcessDPIAware setProcessDPIAware; }; struct QWindowsShell32DLL -- cgit v1.2.3