From e20113402c440754422942da97c9ea38a03563a2 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 16 Oct 2025 11:20:27 +0800 Subject: [PATCH] Make top resizing grabber larger on Windows (#11023) --- src/slic3r/GUI/BBLTopbar.cpp | 19 +++++++++++++++++++ src/slic3r/GUI/BBLTopbar.hpp | 5 +++++ src/slic3r/GUI/MainFrame.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/slic3r/GUI/BBLTopbar.cpp b/src/slic3r/GUI/BBLTopbar.cpp index 0bf251d729..42e2961396 100644 --- a/src/slic3r/GUI/BBLTopbar.cpp +++ b/src/slic3r/GUI/BBLTopbar.cpp @@ -696,3 +696,22 @@ wxAuiToolBarItem* BBLTopbar::FindToolByCurrentPosition() wxPoint client_pos = this->ScreenToClient(mouse_pos); return this->FindToolByPosition(client_pos.x, client_pos.y); } + +#ifdef __WIN32__ +WXLRESULT BBLTopbar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + switch (nMsg) { + case WM_NCHITTEST: { + const wxAuiToolBarItem* current_item = this->FindToolByCurrentPosition(); + if (current_item != nullptr && current_item != m_title_item) { + break; + } + + // Pass the event to main window if mouse is on the top bar and not on any of the buttons + return HTTRANSPARENT; + } + } + + return wxAuiToolBar::MSWWindowProc(nMsg, wParam, lParam); +} +#endif diff --git a/src/slic3r/GUI/BBLTopbar.hpp b/src/slic3r/GUI/BBLTopbar.hpp index 78820813a7..b5f4673a44 100644 --- a/src/slic3r/GUI/BBLTopbar.hpp +++ b/src/slic3r/GUI/BBLTopbar.hpp @@ -56,6 +56,11 @@ public: void ShowCalibrationButton(bool show = true); +protected: +#ifdef __WIN32__ + WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override; +#endif + private: wxFrame* m_frame; wxAuiToolBarItem* m_file_menu_item; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index df1dc541c4..f48d2197aa 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -739,6 +739,36 @@ WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam } break; + case WM_NCHITTEST: { + if (IsMaximized()) { + // When maximized, no resize border + return HTCAPTION; + } + + // Allow resizing from top of the title bar + wxPoint mouse_pos = ::wxGetMousePosition(); + if (m_topbar->GetScreenRect().GetBottom() >= mouse_pos.y) { + RECT borderThickness; + SetRectEmpty(&borderThickness); + AdjustWindowRectEx(&borderThickness, GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION, FALSE, NULL); + borderThickness.left *= -1; + borderThickness.top *= -1; + wxPoint client_pos = this->ScreenToClient(mouse_pos); + + bool on_top_border = client_pos.y <= borderThickness.top; + + // And to allow diagonally resizing, we check if mouse is at window corner + if (client_pos.x <= borderThickness.left) { + return on_top_border ? HTTOPLEFT : HTLEFT; + } else if (client_pos.x >= GetClientSize().x - borderThickness.right) { + return on_top_border ? HTTOPRIGHT : HTRIGHT; + } + + return on_top_border ? HTTOP : HTCAPTION; + } + break; + } + case WM_GETMINMAXINFO: { auto mmi = (MINMAXINFO*) lParam; HandleGetMinMaxInfo(mmi);