From 8517f5b133f1aceff893a1a01417157136fe0715 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周一, 01 1月 2024 13:33:29 +0800 Subject: [PATCH] Add license and prepare to release --- src/core/contexts/win32windowcontext.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index dfbf2e2..f9be258 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -1,3 +1,6 @@ +// Copyright (C) 2023-2024 Stdware Collections +// SPDX-License-Identifier: Apache-2.0 + #include "win32windowcontext_p.h" #include <optional> @@ -680,14 +683,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 +732,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 we 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 +826,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 +956,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 +990,6 @@ bb.dwFlags = DWM_BB_ENABLE; apis.pDwmEnableBlurBehindWindow(hwnd, &bb); } - restoreMargins(); } return true; } -- Gitblit v1.9.1