diff --git a/src/FluFrameless.cpp b/src/FluFrameless.cpp index 77273b10..1e9551f2 100644 --- a/src/FluFrameless.cpp +++ b/src/FluFrameless.cpp @@ -35,6 +35,19 @@ static inline bool isCompositionEnabled() { return false; } +static inline void setShadow(HWND hwnd) { + const MARGINS shadow = {1, 0, 0, 0}; + typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPtr)(HWND hWnd, const MARGINS *pMarInset); + HMODULE module = LoadLibraryW(L"dwmapi.dll"); + if (module) { + DwmExtendFrameIntoClientAreaPtr dwm_extendframe_into_client_area_; + dwm_extendframe_into_client_area_ = reinterpret_cast(GetProcAddress(module, "DwmExtendFrameIntoClientArea")); + if (dwm_extendframe_into_client_area_) { + dwm_extendframe_into_client_area_(hwnd, &shadow); + } + } +} + #endif bool containsCursorToItem(QQuickItem *item) { @@ -92,20 +105,31 @@ void FluFrameless::componentComplete() { HWND hwnd = reinterpret_cast(window()->winId()); DWORD style = ::GetWindowLongPtr(hwnd, GWL_STYLE); if (_fixSize) { +#if (QT_VERSION == QT_VERSION_CHECK(6, 5, 3) || QT_VERSION == QT_VERSION_CHECK(6, 6, 0)) ::SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_THICKFRAME);; +#else + ::SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION); +#endif for (int i = 0; i <= QGuiApplication::screens().count() - 1; ++i) { connect(QGuiApplication::screens().at(i), &QScreen::logicalDotsPerInchChanged, this, [=] { SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_FRAMECHANGED); }); } } else { +#if (QT_VERSION == QT_VERSION_CHECK(6, 5, 3) || QT_VERSION == QT_VERSION_CHECK(6, 6, 0)) ::SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME); +#else + ::SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CAPTION); +#endif } SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); connect(window(), &QQuickWindow::screenChanged, this, [hwnd] { ::SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOOWNERZORDER); ::RedrawWindow(hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW); }); + if (!window()->property("_hideShadow").toBool()) { + setShadow(hwnd); + } #endif auto appBarHeight = _appbar->height(); h = qRound(h + appBarHeight); @@ -149,30 +173,38 @@ void FluFrameless::componentComplete() { } return false; } else if (uMsg == WM_NCCALCSIZE && wParam == TRUE) { - const auto clientRect = ((wParam == FALSE) ? reinterpret_cast(lParam) : &(reinterpret_cast(lParam))->rgrc[0]); + const auto clientRect = &(reinterpret_cast(lParam))->rgrc[0]; const LONG originalTop = clientRect->top; const LONG originalLeft = clientRect->left; - const LONG originalRight = clientRect->right; const LONG originalBottom = clientRect->bottom; + const LONG originalRight = clientRect->right; const LRESULT hitTestResult = ::DefWindowProcW(hwnd, WM_NCCALCSIZE, wParam, lParam); if ((hitTestResult != HTERROR) && (hitTestResult != HTNOWHERE)) { - *result = hitTestResult; + *result = static_cast(hitTestResult); return true; } - int offsetSize; +#if (QT_VERSION == QT_VERSION_CHECK(6, 5, 3) || QT_VERSION == QT_VERSION_CHECK(6, 6, 0)) + clientRect->top = originalTop; + clientRect->bottom = originalBottom; + clientRect->left = originalLeft; + clientRect->right = originalRight; +#else bool isMaximum = ::IsZoomed(hwnd); - if (isMaximum || _isFullScreen()) { - offsetSize = 0; + if (isMaximum) { + auto geometry = window()->screen()->geometry(); + auto offsetX = qAbs(geometry.left() - originalLeft); + auto offsetY = qAbs(geometry.top() - originalTop); + clientRect->top = originalTop + offsetY; + clientRect->bottom = originalBottom - offsetY; + clientRect->left = originalLeft + offsetX; + clientRect->right = originalRight - offsetX; } else { - offsetSize = 1; + clientRect->top = originalTop; + clientRect->bottom = originalBottom; + clientRect->left = originalLeft; + clientRect->right = originalRight; } - if (!isCompositionEnabled()) { - offsetSize = 0; - } - clientRect->top = originalTop + offsetSize; - clientRect->bottom = originalBottom - offsetSize; - clientRect->left = originalLeft + offsetSize; - clientRect->right = originalRight - offsetSize; +#endif _setMaximizeHovered(false); *result = WVR_REDRAW; return true; @@ -230,12 +262,21 @@ void FluFrameless::componentComplete() { *result = HTCLIENT; return true; } else if (uMsg == WM_NCPAINT) { +#if (QT_VERSION == QT_VERSION_CHECK(6, 5, 3) || QT_VERSION == QT_VERSION_CHECK(6, 6, 0)) *result = FALSE; return true; +#else + if (isCompositionEnabled()) { + return false; + } + *result = FALSE; + return true; +#endif } else if (uMsg == WM_NCACTIVATE) { *result = TRUE; return true; } else if (uMsg == WM_GETMINMAXINFO) { +#if (QT_VERSION == QT_VERSION_CHECK(6, 5, 3) || QT_VERSION == QT_VERSION_CHECK(6, 6, 0)) auto *minmaxInfo = reinterpret_cast(lParam); auto pixelRatio = window()->devicePixelRatio(); auto geometry = window()->screen()->availableGeometry(); @@ -245,6 +286,7 @@ void FluFrameless::componentComplete() { minmaxInfo->ptMaxPosition.y = rect.top; minmaxInfo->ptMaxSize.x = qRound(geometry.width() * pixelRatio); minmaxInfo->ptMaxSize.y = qRound(geometry.height() * pixelRatio); +#endif return false; } else if (_isWindows11OrGreater && (uMsg == WM_NCLBUTTONDBLCLK || uMsg == WM_NCLBUTTONDOWN)) { if (_hitMaximizeButton()) { diff --git a/src/Qt5/imports/FluentUI/Controls/FluAppBar.qml b/src/Qt5/imports/FluentUI/Controls/FluAppBar.qml index 74e7fc20..9ec2bb56 100644 --- a/src/Qt5/imports/FluentUI/Controls/FluAppBar.qml +++ b/src/Qt5/imports/FluentUI/Controls/FluAppBar.qml @@ -43,12 +43,12 @@ Rectangle{ property alias layoutStandardbuttons: layout_standard_buttons property var maxClickListener : function(){ if(FluTools.isMacos()){ - if (d.win.visibility === Window.FullScreen) + if (d.win.visibility === Window.FullScreen || d.win.visibility === Window.Maximized) d.win.showNormal() else d.win.showFullScreen() }else{ - if (d.win.visibility === Window.Maximized) + if (d.win.visibility === Window.Maximized || d.win.visibility === Window.FullScreen) d.win.showNormal() else d.win.showMaximized() @@ -93,7 +93,7 @@ Rectangle{ } return false } - property bool isRestore: win && Window.Maximized === win.visibility + property bool isRestore: win && (Window.Maximized === win.visibility || Window.FullScreen === win.visibility) property bool resizable: win && !(win.height === win.maximumHeight && win.height === win.minimumHeight && win.width === win.maximumWidth && win.width === win.minimumWidth) function containsPointToItem(point,item){ var pos = item.mapToGlobal(0,0)