From e5370435a9d4297d0ba227f2237d7ed16bba7e82 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <zhaoyuhang@rankyee.com> Date: 周三, 27 12月 2023 17:15:52 +0800 Subject: [PATCH] fix some win32 issues --- src/core/contexts/win32windowcontext.cpp | 55 +++++++++++++++++++++++++++++-------------------------- 1 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index bf25bdb..00d42c1 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -9,7 +9,6 @@ #include <QtGui/QGuiApplication> #include <QtGui/QPainter> #include <QtGui/QPalette> -#include <QtGui/QStyleHints> #include <QtGui/private/qhighdpiscaling_p.h> #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -47,13 +46,13 @@ static WNDPROC g_qtWindowProc = nullptr; static inline bool -#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) +#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) constexpr #endif isSystemBorderEnabled() { return -#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) isWin10OrGreater() #else false @@ -402,8 +401,8 @@ return false; } - static WindowsNativeEventFilter *instance; - static Win32WindowContext *lastMessageContext; + static inline WindowsNativeEventFilter *instance = nullptr; + static inline Win32WindowContext *lastMessageContext = nullptr; static inline void install() { if (instance) { @@ -420,9 +419,6 @@ instance = nullptr; } }; - - WindowsNativeEventFilter *WindowsNativeEventFilter::instance = nullptr; - Win32WindowContext *WindowsNativeEventFilter::lastMessageContext = nullptr; // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1025 // We can see from the source code that Qt will filter out some messages first and then send the @@ -574,6 +570,7 @@ case RaiseWindowHook: { if (!windowId) return; + m_delegate->setWindowVisible(m_host, true); const auto hwnd = reinterpret_cast<HWND>(windowId); bringWindowToFront(hwnd); return; @@ -606,7 +603,7 @@ } case DrawWindows10BorderHook: { -#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) if (!windowId) return; @@ -651,7 +648,7 @@ } case DrawWindows10BorderHook2: { -#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) if (!m_windowHandle) return; @@ -687,10 +684,20 @@ if (!m_windowHandle) return {}; - auto hwnd = reinterpret_cast<HWND>(windowId); - RECT frame{}; - ::AdjustWindowRectExForDpi(&frame, ::GetWindowLongPtrW(hwnd, GWL_STYLE), FALSE, 0, - getDpiForWindow(hwnd)); + auto frame = [this]() -> RECT { + auto hwnd = reinterpret_cast<HWND>(windowId); + // According to MSDN, WS_OVERLAPPED is not allowed for AdjustWindowRect. + auto style = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_STYLE) & ~WS_OVERLAPPED); + auto exStyle = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_EXSTYLE)); + RECT result{}; + const DynamicApis &apis = DynamicApis::instance(); + if (apis.pAdjustWindowRectExForDpi) { + apis.pAdjustWindowRectExForDpi(&result, style, FALSE, exStyle, getDpiForWindow(hwnd)); + } else { + ::AdjustWindowRectEx(&result, style, FALSE, exStyle); + } + return result; + }(); return QVariant::fromValue(rect2qrect(frame)); } @@ -723,13 +730,13 @@ auto hWnd = reinterpret_cast<HWND>(winId); if (!isSystemBorderEnabled()) { - setWindowAttribute(QStringLiteral("extra-margins"), - QVariant::fromValue(QMargins(1, 1, 1, 1))); + static auto margins = QVariant::fromValue(QMargins(1, 1, 1, 1)); + setWindowAttribute(QStringLiteral("extra-margins"), margins); } { auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE); -#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU)); #else ::SetWindowLongPtrW(hWnd, GWL_STYLE, @@ -812,7 +819,7 @@ if (key == QStringLiteral("extra-margins")) { auto margins = qmargins2margins(attribute.value<QMargins>()); - DynamicApis::instance().pDwmExtendFrameIntoClientArea(hwnd, &margins); + apis.pDwmExtendFrameIntoClientArea(hwnd, &margins); return true; } @@ -943,12 +950,9 @@ } if (key == QStringLiteral("dwm-blur")) { - // TODO: Optimize - // Currently not available!!! if (attribute.toBool()) { - // We need to extend the window frame into the whole client area to be able - // to see the blurred window background. - apis.pDwmExtendFrameIntoClientArea(hwnd, &extendedMargins); + // We can't extend the window frame for this effect. + restoreMargins(); if (isWin8OrGreater()) { ACCENT_POLICY policy{}; policy.dwAccentState = ACCENT_ENABLE_BLURBEHIND; @@ -980,7 +984,6 @@ bb.dwFlags = DWM_BB_ENABLE; apis.pDwmEnableBlurBehindWindow(hwnd, &bb); } - restoreMargins(); } return true; } @@ -1319,12 +1322,12 @@ LPARAM lParam, LRESULT *result) { switch (message) { case WM_SHOWWINDOW: { - if (!centered) { + if (!initialCentered) { // If wParam is TRUE, the window is being shown. // If lParam is zero, the message was sent because of a call to the ShowWindow // function. if (wParam && !lParam) { - centered = true; + initialCentered = true; moveWindowToDesktopCenter(hWnd); } } -- Gitblit v1.9.1