From 3a5e5aea06e87710e24db0d7439ab81e3e3d301f Mon Sep 17 00:00:00 2001 From: Zhao Yuhang <2546789017@qq.com> Date: 周六, 09 12月 2023 17:24:04 +0800 Subject: [PATCH] fix system menu --- src/core/contexts/win32windowcontext.cpp | 41 +++++++++++++++++++++++++---------------- 1 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index 9581b94..72f20e0 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -289,7 +289,7 @@ #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (QPlatformWindow *platformWindow = window->handle()) { if (const auto ni = QGuiApplication::platformNativeInterface()) { - ni->setWindowProperty(platformWindow, QStringLiteral("_q_windowsCustomMargins"), + ni->setWindowProperty(platformWindow, QStringLiteral("WindowsCustomMargins"), marginsVar); } } @@ -476,7 +476,7 @@ } ::SetMenuDefaultItem(hMenu, defaultItemId.value_or(UINT_MAX), FALSE); - ::DrawMenuBar(hWnd); + //::DrawMenuBar(hWnd); // Popup the system menu at the required position. const auto result = ::TrackPopupMenu(hMenu, (TPM_RETURNCMD | (QGuiApplication::isRightToLeft() ? TPM_RIGHTALIGN : TPM_LEFTALIGN)), pos.x, pos.y, 0, hWnd, nullptr); @@ -764,10 +764,6 @@ return false; } - if (systemMenuHandler(hWnd, message, wParam, lParam, result)) { - return true; - } - // Test snap layout if (snapLayoutHandler(hWnd, message, wParam, lParam, result)) { return true; @@ -775,6 +771,10 @@ // Main implementation if (customWindowHandler(hWnd, message, wParam, lParam, result)) { + return true; + } + + if (systemMenuHandler(hWnd, message, wParam, lParam, result)) { return true; } @@ -1187,22 +1187,31 @@ // this is also the normal behavior of a native Win32 window (but only when the // window is not maximized/fullscreen/minimized, of course). if (isWindowNoState(hWnd)) { - static constexpr const int kBorderSize = 2; + static constexpr const auto kBorderSize = quint8{2}; bool isTop = (nativeLocalPos.y <= kBorderSize); + bool isLeft = nativeLocalPos.x <= kBorderSize; bool isRight = (nativeLocalPos.x >= (clientWidth - kBorderSize)); - if (isTop || isRight) { + if (isTop || isLeft || isRight) { if (dontOverrideCursor) { // The user doesn't want the window to be resized, so we tell // Windows we are in the client area so that the controls beneath // the mouse cursor can still be hovered or clicked. *result = (isTitleBar ? HTCAPTION : HTCLIENT); } else { - if (isTop && isRight) { - *result = HTTOPRIGHT; - } else if (isTop) { - *result = HTTOP; + if (isTop) { + if (isLeft) { + *result = HTTOPLEFT; + } else if (isRight) { + *result = HTTOPRIGHT; + } else { + *result = HTTOP; + } } else { - *result = HTRIGHT; + if (isLeft) { + *result = HTLEFT; + } else { + *result = HTRIGHT; + } } } } @@ -1302,9 +1311,9 @@ const bool isBottom = (nativeLocalPos.y >= (clientHeight - frameSize)); // Make the border a little wider to let the user easy to resize on corners. const auto scaleFactor = ((isTop || isBottom) ? qreal(2) : qreal(1)); - const int scaledFrameSizeX = std::round(qreal(frameSize) * scaleFactor); - const bool isLeft = (nativeLocalPos.x < scaledFrameSizeX); - const bool isRight = (nativeLocalPos.x >= (clientWidth - scaledFrameSizeX)); + const int scaledFrameSize = std::round(qreal(frameSize) * scaleFactor); + const bool isLeft = (nativeLocalPos.x < scaledFrameSize); + const bool isRight = (nativeLocalPos.x >= (clientWidth - scaledFrameSize)); if (dontOverrideCursor && (isTop || isBottom || isLeft || isRight)) { // Return HTCLIENT instead of HTBORDER here, because the mouse is // inside the window now, return HTCLIENT to let the controls -- Gitblit v1.9.1