Zhao Yuhang
2023-12-22 e331fb1feda8891baba2a2dc1caeed67834d9d93
src/core/contexts/win32windowcontext.cpp
@@ -724,18 +724,8 @@
#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
        {
            DWORD style = ::GetWindowLongW(hWnd, GWL_STYLE);
            ::SetWindowLongW(hWnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION);
        }
#endif
#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0)
        for (const auto attr : {
                 _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1,
                 _DWMWA_USE_IMMERSIVE_DARK_MODE,
             }) {
            const BOOL enable = TRUE;
            DynamicApis::instance().pDwmSetWindowAttribute(hWnd, attr, &enable, sizeof(enable));
            auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE);
            ::SetWindowLongPtrW(hWnd, GWL_STYLE, (style | WS_THICKFRAME) & (~WS_CAPTION));
        }
#endif
@@ -942,6 +932,29 @@
                }
                apis.pDwmExtendFrameIntoClientArea(hwnd, &defaultMargins);
            }
            return true;
        } else if (key == QStringLiteral("dark-mode")) {
            if (!isWin101809OrGreater()) {
                return false;
            }
            BOOL enable = attribute.toBool();
            if (isWin101903OrGreater()) {
                apis.pSetPreferredAppMode(enable ? PAM_AUTO : PAM_DEFAULT);
            } else {
                apis.pAllowDarkModeForApp(enable);
            }
            for (const auto attr : {
                    _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1,
                    _DWMWA_USE_IMMERSIVE_DARK_MODE,
            }) {
                apis.pDwmSetWindowAttribute(hwnd, attr, &enable, sizeof(enable));
            }
            apis.pFlushMenuThemes();
            return true;
        }
        return false;
@@ -1667,7 +1680,6 @@
        Q_UNUSED(message)
        Q_UNUSED(this)
#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
        // Windows是根据这个消息的返回值来设置窗口的客户区(窗口中真正显示的内容)
        // 和非客户区(标题栏、窗口边框、菜单栏和状态栏等Windows系统自行提供的部分
        // ,不过对于Qt来说,除了标题栏和窗口边框,非客户区基本也都是自绘的)的范
@@ -1755,6 +1767,7 @@
        // and align it with the upper-left corner of our new client area".
        const auto clientRect = wParam ? &(reinterpret_cast<LPNCCALCSIZE_PARAMS>(lParam))->rgrc[0]
                                       : reinterpret_cast<LPRECT>(lParam);
#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
        if (isWin10OrGreater()) {
            // Store the original top margin before the default window procedure applies the
            // default frame.
@@ -1782,6 +1795,7 @@
            // technique to bring the top border back.
            clientRect->top = originalTop;
        }
#endif
        const bool max = IsMaximized(hWnd);
        const bool full = isFullScreen(hWnd);
        // We don't need this correction when we're fullscreen. We will
@@ -1875,7 +1889,6 @@
                }
            }
        }
#endif
        // We should call this function only before the function returns.
        syncPaintEventWithDwm();
        // By returning WVR_REDRAW we can make the window resizing look