From 5a0e5a9261c251dba54afb8cc0b6b32ae9d95510 Mon Sep 17 00:00:00 2001 From: Zhao Yuhang <2546789017@qq.com> Date: 周二, 12 12月 2023 19:50:34 +0800 Subject: [PATCH] add theme win32 message --- src/core/contexts/win32windowcontext_p.h | 42 ++++++++++++++++++++++++++++++++++++------ 1 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/core/contexts/win32windowcontext_p.h b/src/core/contexts/win32windowcontext_p.h index 52f4433..ee6769e 100644 --- a/src/core/contexts/win32windowcontext_p.h +++ b/src/core/contexts/win32windowcontext_p.h @@ -6,10 +6,12 @@ namespace QWK { + class Win10BorderHandler; + class QWK_CORE_EXPORT Win32WindowContext : public AbstractWindowContext { Q_OBJECT public: - Win32WindowContext(QWindow *window, WindowItemDelegate *delegate); + Win32WindowContext(); ~Win32WindowContext() override; enum WindowPart { @@ -21,22 +23,50 @@ TitleBar, }; - public: - bool setup() override; + QString key() const override; + void virtual_hook(int id, void *data) override; + Q_INVOKABLE bool needWin10BorderHandler() const; + Q_INVOKABLE void setWin10BorderHandler(Win10BorderHandler *handler); + + protected: + bool setupHost() override; + + public: bool windowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); + + bool systemMenuHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + // In order to perfectly apply Windows 11 Snap Layout into the Qt window, we need to + // intercept and simulate most of the mouse events, so that the processing logic + // is quite complex. Simultaneously, in order to make the handling code of other + // Windows messages clearer, we have separated them into this function. bool snapLayoutHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); + + bool customWindowHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + bool nonClientCalcSizeHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + bool themeStuffHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *resul); protected: WId windowId = 0; - // Store the last hit test result, it's helpful to handle WM_MOUSEMOVE and WM_NCMOUSELEAVE. + // The last hit test result, helpful to handle WM_MOUSEMOVE and WM_NCMOUSELEAVE. WindowPart lastHitTestResult = WindowPart::Outside; - // True if we blocked a WM_MOUSELEAVE when mouse moves on chrome button, false when a - // WM_MOUSELEAVE comes or we manually call TrackMouseEvent(). + // Whether the last mouse leave message is blocked, mainly for handling the unexpected + // WM_MOUSELEAVE. bool mouseLeaveBlocked = false; + + bool centered = false; + + std::unique_ptr<Win10BorderHandler> win10BorderHandler; }; } -- Gitblit v1.9.1