CMakeLists.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/CMakeLists.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/CMakeLists.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/contexts/win32windowcontext.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/style/styleagent.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/style/styleagent_p.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/style/styleagent_win.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/windowagentbase.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/widgets/widgetwindowagent_win.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
CMakeLists.txt
@@ -12,8 +12,9 @@ option(QWINDOWKIT_BUILD_DOCUMENTATIONS "Build documentations" OFF) option(QWINDOWKIT_INSTALL "Install library" ON) option(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT "Enable Qt Window Context anyway" OFF) option(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT "Enable Qt Window Context anyway" OFF) option(QWINDOWKIT_ENABLE_STYLE_AGENT "Enable building style agent" ON) option(QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER "Disable system border on Windows" ON) # ---------------------------------- # CMake Settings src/CMakeLists.txt
@@ -14,7 +14,15 @@ set(QMSETUP_DEFINITION_SCOPE DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set(QMSETUP_DEFINITION_NUMERICAL on) qm_add_definition(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT CONDITION QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT) qm_add_definition(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT CONDITION QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT ) qm_add_definition(QWINDOWKIT_ENABLE_STYLE_AGENT CONDITION QWINDOWKIT_ENABLE_STYLE_AGENT ) qm_add_definition(QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER CONDITION QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER ) qm_generate_config(${QWINDOWKIT_BUILD_INCLUDE_DIR}/QWKCore/qwkconfig.h) src/core/CMakeLists.txt
@@ -33,7 +33,7 @@ ) endif() if(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT) if(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT) list(APPEND _src contexts/qtwindowcontext_p.h contexts/qtwindowcontext.cpp src/core/contexts/win32windowcontext.cpp
@@ -21,6 +21,8 @@ # include <QtGui/qpa/qplatformwindow_p.h> #endif #include <QWKCore/qwkconfig.h> #include "qwkglobal_p.h" #include "qwkwindowsextra_p.h" @@ -712,10 +714,20 @@ auto winId = m_windowHandle->winId(); auto hWnd = reinterpret_cast<HWND>(winId); if (!isWin10OrGreater()) { #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) if (!isWin10OrGreater()) #endif { static constexpr const MARGINS margins = {1, 1, 1, 1}; DynamicApis::instance().pDwmExtendFrameIntoClientArea(hWnd, &margins); } #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 : { @@ -792,7 +804,8 @@ const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); const DynamicApis &apis = DynamicApis::instance(); static constexpr const MARGINS extendMargins = {-1, -1, -1, -1}; static const auto defaultMargins = isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; static const auto defaultMargins = isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; if (key == QStringLiteral("mica")) { if (!isWin11OrGreater()) { return false; @@ -1459,6 +1472,7 @@ int frameSize = getResizeBorderThickness(hWnd); bool isTop = (nativeLocalPos.y < frameSize); #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) if (isWin10OrGreater()) { // This will handle the left, right and bottom parts of the frame // because we didn't change them. @@ -1501,7 +1515,9 @@ } *result = HTCLIENT; return true; } else { } else #endif { if (full) { *result = HTCLIENT; return true; @@ -1651,6 +1667,7 @@ Q_UNUSED(message) Q_UNUSED(this) #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) // Windows是根据这个消息的返回值来设置窗口的客户区(窗口中真正显示的内容) // 和非客户区(标题栏、窗口边框、菜单栏和状态栏等Windows系统自行提供的部分 // ,不过对于Qt来说,除了标题栏和窗口边框,非客户区基本也都是自绘的)的范 @@ -1858,6 +1875,7 @@ } } } #endif // We should call this function only before the function returns. syncPaintEventWithDwm(); // By returning WVR_REDRAW we can make the window resizing look src/core/style/styleagent.cpp
@@ -8,7 +8,13 @@ StyleAgentPrivate::StyleAgentPrivate() { } StyleAgentPrivate::~StyleAgentPrivate() = default; StyleAgentPrivate::~StyleAgentPrivate() { removeSystemThemeHook(); } void StyleAgentPrivate::init() { setupSystemThemeHook(); } void StyleAgentPrivate::notifyThemeChanged(StyleAgent::SystemTheme theme) { if (theme == systemTheme) @@ -20,13 +26,9 @@ } StyleAgent::StyleAgent(QObject *parent) : StyleAgent(*new StyleAgentPrivate(), parent) { Q_D(StyleAgent); d->setupSystemThemeHook(); } StyleAgent::~StyleAgent() { Q_D(StyleAgent); d->removeSystemThemeHook(); } StyleAgent::SystemTheme StyleAgent::systemTheme() const { src/core/style/styleagent_p.h
@@ -28,8 +28,8 @@ StyleAgent::SystemTheme systemTheme = StyleAgent::Unknown; virtual void setupSystemThemeHook(); virtual void removeSystemThemeHook(); void setupSystemThemeHook(); void removeSystemThemeHook(); void notifyThemeChanged(StyleAgent::SystemTheme theme); }; src/core/style/styleagent_win.cpp
@@ -85,7 +85,7 @@ SystemSettingEventFilter *SystemSettingEventFilter::instance = nullptr; void StyleAgentPrivate::init() { void StyleAgentPrivate::setupSystemThemeHook() { if (isHighContrastModeEnabled()) { systemTheme = StyleAgent::HighContrast; } else if (isDarkThemeActive()) { @@ -93,9 +93,7 @@ } else { systemTheme = StyleAgent::Light; } } void StyleAgentPrivate::setupSystemThemeHook() { g_styleAgentSet->insert(this); SystemSettingEventFilter::install(); } src/core/windowagentbase.cpp
@@ -5,9 +5,9 @@ #include "qwkglobal_p.h" #if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) #if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) # include "win32windowcontext_p.h" #elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) #elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) # include "cocoawindowcontext_p.h" #else # include "qtwindowcontext_p.h" @@ -33,9 +33,9 @@ return windowContextFactoryMethod(); } #if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) #if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) return new Win32WindowContext(); #elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) #elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) return new CocoaWindowContext(); #else return new QtWindowContext(); src/widgets/widgetwindowagent_win.cpp
@@ -1,5 +1,8 @@ #include "widgetwindowagent_p.h" #include <QWKCore/qwkconfig.h> #include <QWKCore/qwkglobal.h> #include <QtGui/QPainter> #include <QWKCore/qwindowkit_windows.h> @@ -7,6 +10,7 @@ namespace QWK { #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) class WidgetBorderHandler : public QObject, public NativeEventFilter { public: explicit WidgetBorderHandler(QWidget *widget, AbstractWindowContext *ctx) @@ -105,13 +109,16 @@ QWidget *widget; AbstractWindowContext *ctx; }; #endif void WidgetWindowAgentPrivate::setupWindows10BorderWorkaround() { #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) // Install painting hook auto ctx = context.get(); if (ctx->property("needBorderPainter").toBool()) { std::ignore = new WidgetBorderHandler(hostWidget, ctx); } #endif } }