From 6b2d31247dc2c2804e571b31a71c8a423c1db9d4 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周二, 26 12月 2023 01:44:03 +0800 Subject: [PATCH] Totally fix top border issue on Win10 for QtWidgets --- src/core/shared/qwkwindowsextra_p.h | 66 +++++++++++++++++++++++++++++++-- 1 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/core/shared/qwkwindowsextra_p.h b/src/core/shared/qwkwindowsextra_p.h index ede119c..8ada487 100644 --- a/src/core/shared/qwkwindowsextra_p.h +++ b/src/core/shared/qwkwindowsextra_p.h @@ -145,9 +145,9 @@ // Win10 1809 (10.0.17763) using RefreshImmersiveColorPolicyStatePtr = VOID(WINAPI *)(VOID); // Ordinal 104 - using AllowDarkModeForWindowPtr = BOOL(WINAPI *)(HWND, BOOL); // Ordinal 133 - using AllowDarkModeForAppPtr = BOOL(WINAPI *)(BOOL); // Ordinal 135 - using FlushMenuThemesPtr = VOID(WINAPI *)(VOID); // Ordinal 136 + using AllowDarkModeForWindowPtr = BOOL(WINAPI *)(HWND, BOOL); // Ordinal 133 + using AllowDarkModeForAppPtr = BOOL(WINAPI *)(BOOL); // Ordinal 135 + using FlushMenuThemesPtr = VOID(WINAPI *)(VOID); // Ordinal 136 // Win10 1903 (10.0.18362) using SetPreferredAppModePtr = PREFERRED_APP_MODE(WINAPI *)(PREFERRED_APP_MODE); // Ordinal 135 @@ -213,7 +213,7 @@ #undef DYNAMIC_API_RESOLVE -#define UNDOC_API_RESOLVE(DLL, NAME, ORDINAL) \ +#define UNDOC_API_RESOLVE(DLL, NAME, ORDINAL) \ p##NAME = reinterpret_cast<decltype(p##NAME)>(DLL.resolve(MAKEINTRESOURCEA(ORDINAL))) QSystemLibrary uxtheme(QStringLiteral("uxtheme")); @@ -300,6 +300,15 @@ static inline constexpr RECT qrect2rect(const QRect &qrect) { return RECT{LONG(qrect.left()), LONG(qrect.top()), LONG(qrect.right()), LONG(qrect.bottom())}; + } + + static inline constexpr QMargins margins2qmargins(const MARGINS &margins) { + return {margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth, + margins.cyBottomHeight}; + } + + static inline constexpr MARGINS qmargins2margins(const QMargins &qmargins) { + return MARGINS{qmargins.left(), qmargins.right(), qmargins.top(), qmargins.bottom()}; } static inline /*constexpr*/ QString hwnd2str(const WId windowId) { @@ -432,6 +441,55 @@ #endif } + static inline quint32 getDpiForWindow(HWND hwnd) { + const DynamicApis &apis = DynamicApis::instance(); + if (apis.pGetDpiForWindow) { // Win10 + return apis.pGetDpiForWindow(hwnd); + } else if (apis.pGetDpiForMonitor) { // Win8.1 + HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + UINT dpiX{0}; + UINT dpiY{0}; + apis.pGetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY); + return dpiX; + } else { // Win2K + HDC hdc = ::GetDC(nullptr); + const int dpiX = ::GetDeviceCaps(hdc, LOGPIXELSX); + // const int dpiY = ::GetDeviceCaps(hdc, LOGPIXELSY); + ::ReleaseDC(nullptr, hdc); + return quint32(dpiX); + } + } + + static inline quint32 getSystemMetricsForDpi(int index, quint32 dpi) { + const DynamicApis &apis = DynamicApis::instance(); + if (apis.pGetSystemMetricsForDpi) { + return ::GetSystemMetricsForDpi(index, dpi); + } + return ::GetSystemMetrics(index); + } + + static inline quint32 getWindowFrameBorderThickness(HWND hwnd) { + const DynamicApis &apis = DynamicApis::instance(); + if (UINT result = 0; SUCCEEDED(apis.pDwmGetWindowAttribute( + hwnd, _DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, &result, sizeof(result)))) { + return result; + } + return getSystemMetricsForDpi(SM_CXBORDER, getDpiForWindow(hwnd)); + } + + static inline quint32 getResizeBorderThickness(HWND hwnd) { + const quint32 dpi = getDpiForWindow(hwnd); + return getSystemMetricsForDpi(SM_CXSIZEFRAME, dpi) + + getSystemMetricsForDpi(SM_CXPADDEDBORDER, dpi); + } + + static inline quint32 getTitleBarHeight(HWND hwnd) { + const quint32 dpi = getDpiForWindow(hwnd); + return getSystemMetricsForDpi(SM_CYCAPTION, dpi) + + getSystemMetricsForDpi(SM_CXSIZEFRAME, dpi) + + getSystemMetricsForDpi(SM_CXPADDEDBORDER, dpi); + } + } #endif // QWKWINDOWSEXTRA_P_H -- Gitblit v1.9.1