From d3999a80d2487e98a51ce74f19119b1aeb1d315e Mon Sep 17 00:00:00 2001 From: brige Date: Mon, 10 Nov 2025 23:02:14 +0800 Subject: [PATCH] modify can not scale bug --- src/ui/FrameTitleBar.cpp | 8 +++++++- src/ui/FramelessDelegate.cpp | 8 +++----- src/ui/FramelessDelegateWin.cpp | 2 ++ src/ui/FramelessWindow.cpp | 11 +++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/ui/FrameTitleBar.cpp b/src/ui/FrameTitleBar.cpp index fd77758c..dd99f9d1 100644 --- a/src/ui/FrameTitleBar.cpp +++ b/src/ui/FrameTitleBar.cpp @@ -54,7 +54,13 @@ void FrameTitleBar::SetMainWidget(QWidget* widget) { } } void FrameTitleBar::OnMaximized(bool maximized) { - ui->sys_max->setVisible(!maximized); + // 根据配置位决定是否显示最大/还原按钮,并切换图标 + const bool hasMaxButton = (ftbButton_ & FTB_MAX) != 0; + ui->sys_max->setVisible(hasMaxButton); + if (!hasMaxButton) { + return; + } + ui->sys_max->setIcon(QPixmap(maximized ? ":/res/sys_restore.png" : ":/res/sys_max.png")); } QPushButton* FrameTitleBar::InsertPushButtonMenu(const QString& name, int index) { diff --git a/src/ui/FramelessDelegate.cpp b/src/ui/FramelessDelegate.cpp index cf9b20f9..b1f86ed2 100644 --- a/src/ui/FramelessDelegate.cpp +++ b/src/ui/FramelessDelegate.cpp @@ -32,18 +32,18 @@ bool FramelessDelegate::nativeEvent(const QByteArray & eventType, void* message, } void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) { - /* if (nullptr == titleBar || titleBar_ == titleBar) { + if (nullptr == titleBar || titleBar_ == titleBar) { return; } if (nullptr != titleBar_) { titleBar_->removeEventFilter(this); - titleBar_->deleteLater(); } titleBar_ = titleBar; if (nullptr != titleBar_) { + // 跟踪标题栏显示/隐藏,以便在显示时注册为可移动区域 titleBar_->installEventFilter(this); - }*/ + } } void FramelessDelegate::SetTitle(const QString& title) { @@ -60,8 +60,6 @@ bool FramelessDelegate::eventFilter(QObject* watched, QEvent* event) { OnHide(); } else if (QEvent::Close == event->type()) { OnClose(); - } else if (QEvent::WinIdChange == event->type()) { - isFirstShow_ = true; } //#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) else if (QEvent::ScreenChangeInternal == event->type()) { diff --git a/src/ui/FramelessDelegateWin.cpp b/src/ui/FramelessDelegateWin.cpp index cac264d7..26c1cb75 100644 --- a/src/ui/FramelessDelegateWin.cpp +++ b/src/ui/FramelessDelegateWin.cpp @@ -358,6 +358,8 @@ void FramelessDelegateWin::SetNativeWindowLong() { } HWND hwnd = reinterpret_cast(mainWidget_->winId()); unsigned long style = BorderlessFlag; + // 避免父窗口与子窗口重叠绘制导致闪烁,启用剪裁样式 + style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; if (!mainWidget_->windowFlags().testFlag(Qt::WindowMinimizeButtonHint) || mainWidget_->maximumSize() != QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)) { diff --git a/src/ui/FramelessWindow.cpp b/src/ui/FramelessWindow.cpp index c428290d..de061545 100644 --- a/src/ui/FramelessWindow.cpp +++ b/src/ui/FramelessWindow.cpp @@ -8,6 +8,9 @@ FramelessWindow::FramelessWindow(QWidget* parent) : QFrame(parent) { setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); + // 初始化平台相关的无边框委托,用于命中测试和缩放。 + delegate_ = FramelessDelegate::Create(this); + } FramelessWindow::~FramelessWindow() { @@ -15,6 +18,10 @@ FramelessWindow::~FramelessWindow() { void FramelessWindow::SetTitleBar(FrameTitleBar* titleBar) { titleBar->SetMainWidget(this); + if (delegate_) { + // 通知委托当前标题栏,以便把它作为可拖动区域处理。 + delegate_->SetTitleBar(titleBar); + } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -22,5 +29,9 @@ bool FramelessWindow::nativeEvent(const QByteArray& eventType, void* message, qi #else bool FramelessWindow::nativeEvent(const QByteArray & eventType, void* message, long* result) { #endif + // 先让无边框委托处理原生事件(如 WM_NCHITTEST 以支持边缘拖动缩放)。 + if (delegate_ && delegate_->nativeEvent(eventType, message, result)) { + return true; + } return QFrame::nativeEvent(eventType, message, result); }