From 68c8cc026233e9694579ce38b8daa25008477d18 Mon Sep 17 00:00:00 2001
From: Yuhang Zhao <zhaoyuhang@rankyee.com>
Date: 摹曛, 28 12月 2023 16:12:36 +0800
Subject: [PATCH] allow qml demo choose special effect

---
 src/core/contexts/win32windowcontext.cpp |   45 +++++++++++++++++++++++++++------------------
 1 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index dfbf2e2..e4707dc 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -680,14 +680,22 @@
     }
 
     QVariant Win32WindowContext::windowAttribute(const QString &key) const {
-        if (key == QStringLiteral("title-bar-rect")) {
+        if (key == QStringLiteral("window-rect")) {
             if (!m_windowHandle)
                 return {};
 
-            auto hwnd = reinterpret_cast<HWND>(windowId);
             RECT frame{};
-            ::AdjustWindowRectExForDpi(&frame, ::GetWindowLongPtrW(hwnd, GWL_STYLE), FALSE, 0,
-                                       getDpiForWindow(hwnd));
+            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));
+            const DynamicApis &apis = DynamicApis::instance();
+            if (apis.pAdjustWindowRectExForDpi) {
+                apis.pAdjustWindowRectExForDpi(&frame, style, FALSE, exStyle,
+                                               getDpiForWindow(hwnd));
+            } else {
+                ::AdjustWindowRectEx(&frame, style, FALSE, exStyle);
+            }
             return QVariant::fromValue(rect2qrect(frame));
         }
 
@@ -721,17 +729,23 @@
 
         if (!isSystemBorderEnabled()) {
             static auto margins = QVariant::fromValue(QMargins(1, 1, 1, 1));
+
+            // If we remove the system border, the window will lose its shadow. If dwm is enabled,
+            // then you need to set at least 1px margins, otherwise the following operation will
+            // fail with no effect.
             setWindowAttribute(QStringLiteral("extra-margins"), margins);
         }
 
+        // We should disable WS_SYSMENU, otherwise the system button icons will be visible if mica
+        // is enabled and the title bar is transparent
         {
             auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE);
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
-            ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU));
-#else
-            ::SetWindowLongPtrW(hWnd, GWL_STYLE,
-                                (style | WS_THICKFRAME | WS_CAPTION) & (~WS_SYSMENU));
-#endif
+            if (isSystemBorderEnabled()) {
+                ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU));
+            } else {
+                ::SetWindowLongPtrW(hWnd, GWL_STYLE,
+                                    (style | WS_THICKFRAME | WS_CAPTION) & (~WS_SYSMENU));
+            }
         }
 
         // Add managed window
@@ -809,8 +823,7 @@
 
         if (key == QStringLiteral("extra-margins")) {
             auto margins = qmargins2margins(attribute.value<QMargins>());
-            DynamicApis::instance().pDwmExtendFrameIntoClientArea(hwnd, &margins);
-            return true;
+            return apis.pDwmExtendFrameIntoClientArea(hwnd, &margins) == S_OK;
         }
 
         if (key == QStringLiteral("dark-mode")) {
@@ -940,12 +953,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;
@@ -977,7 +987,6 @@
                     bb.dwFlags = DWM_BB_ENABLE;
                     apis.pDwmEnableBlurBehindWindow(hwnd, &bb);
                 }
-                restoreMargins();
             }
             return true;
         }

--
Gitblit v1.9.1