Improve status bar resize handling

- make controls spacing and position consistent.

ref #14959

Close #15090
pull/15145/head
ozone10 2024-05-05 17:35:30 +02:00 committed by Don Ho
parent 3b515f1242
commit 4cd231114e
3 changed files with 52 additions and 59 deletions

View File

@ -294,10 +294,19 @@ void FindReplaceDlg::create(int dialogID, bool isRTL, bool msgDestParent, bool t
_statusBar.init(GetModuleHandle(NULL), _hSelf, 0);
_statusBar.display();
DPIManager& dpiManager = NppParameters::getInstance()._dpiManager;
setDpi();
RECT rcClient{};
getClientRect(rcClient);
const LONG padding = _dpiManager.getSystemMetricsForDpi(SM_CXPADDEDBORDER);
_szBorder.cx = (_dpiManager.getSystemMetricsForDpi(SM_CXFRAME) + padding) * 2;
_szBorder.cy = (_dpiManager.getSystemMetricsForDpi(SM_CYFRAME) + padding) * 2 + _dpiManager.getSystemMetricsForDpi(SM_CYCAPTION);
//fill min dialog size info
_szMinDialog.cx = rcClient.right - rcClient.left;
_szMinDialog.cy = rcClient.bottom - rcClient.top;
RECT rect{};
getClientRect(rect);
_tab.init(_hInst, _hSelf, false, true);
NppDarkMode::subclassTabControl(_tab.getHSelf());
@ -313,23 +322,10 @@ void FindReplaceDlg::create(int dialogID, bool isRTL, bool msgDestParent, bool t
_tab.insertAtEnd(findInProjects);
_tab.insertAtEnd(mark);
_tab.reSizeTo(rect);
_tab.reSizeTo(rcClient);
_tab.display();
_initialClientWidth = rect.right - rect.left;
//fill min dialog size info
getWindowRect(_initialWindowRect);
_initialWindowRect.right = _initialWindowRect.right - _initialWindowRect.left + dpiManager.scaleX(10);
_initialWindowRect.left = 0;
_initialWindowRect.bottom = _initialWindowRect.bottom - _initialWindowRect.top;
_initialWindowRect.top = 0;
RECT dlgRc{};
getWindowRect(dlgRc);
RECT countRc{};
::GetWindowRect(::GetDlgItem(_hSelf, IDCCOUNTALL), &countRc);
_initialClientWidth = rcClient.right - rcClient.left;
NppParameters& nppParam = NppParameters::getInstance();
NppGUI& nppGUI = nppParam.getNppGUI();
@ -347,9 +343,15 @@ void FindReplaceDlg::create(int dialogID, bool isRTL, bool msgDestParent, bool t
goToCenter(swpFlags);
}
RECT rcCount{};
getMappedChildRect(IDCCOUNTALL, rcCount);
RECT rcOk{};
getMappedChildRect(IDOK, rcOk);
RECT rcStatusBar{};
::GetClientRect(_statusBar.getHSelf(), &rcStatusBar);
_lesssModeHeight = (countRc.bottom - dlgRc.top) + (rcStatusBar.bottom - rcStatusBar.top) + dpiManager.scaleY(10);
_lesssModeHeight = (rcCount.bottom + (rcCount.top - rcOk.bottom) + (rcStatusBar.bottom - rcStatusBar.top));
if (nppGUI._findWindowLessMode)
{
@ -1169,13 +1171,13 @@ void FindReplaceDlg::resizeDialogElements(LONG newWidth)
IDC_FINDPREV, IDC_FINDNEXT, IDC_2_BUTTONS_MODE, IDC_COPY_MARKED_TEXT, IDD_FINDINFILES_REPLACEINPROJECTS, IDD_RESIZE_TOGGLE_BUTTON
};
const UINT flags = SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS;
constexpr UINT flags = SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS;
auto newDeltaWidth = newWidth - _initialClientWidth;
auto addWidth = newDeltaWidth - _deltaWidth;
_deltaWidth = newDeltaWidth;
RECT rc;
RECT rc{};
for (int id : resizeWindowIDs)
{
HWND resizeHwnd = ::GetDlgItem(_hSelf, id);
@ -1202,13 +1204,8 @@ void FindReplaceDlg::resizeDialogElements(LONG newWidth)
::SetWindowPos(moveHwnd, NULL, rc.left + addWidth, rc.top, 0, 0, SWP_NOSIZE | flags);
}
auto additionalWindowHwndsToResize = { _tab.getHSelf() , _statusBar.getHSelf() };
for (HWND resizeHwnd : additionalWindowHwndsToResize)
{
::GetClientRect(resizeHwnd, &rc);
::SetWindowPos(resizeHwnd, NULL, 0, 0, rc.right + addWidth, rc.bottom, SWP_NOMOVE | flags);
}
::GetClientRect(_tab.getHSelf(), &rc);
::SetWindowPos(_tab.getHSelf(), nullptr, 0, 0, rc.right + addWidth, rc.bottom, SWP_NOMOVE | flags);
}
std::mutex findOps_mutex;
@ -1221,16 +1218,18 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA
{
bool isLessModeOn = NppParameters::getInstance().getNppGUI()._findWindowLessMode;
MINMAXINFO* mmi = reinterpret_cast<MINMAXINFO*>(lParam);
mmi->ptMinTrackSize.y = isLessModeOn ? _lesssModeHeight : _initialWindowRect.bottom;
mmi->ptMinTrackSize.x = _initialWindowRect.right;
mmi->ptMaxTrackSize.y = isLessModeOn ? _lesssModeHeight : _initialWindowRect.bottom;
mmi->ptMinTrackSize.x = _szMinDialog.cx + _szBorder.cx;
const LONG h = (isLessModeOn ? _lesssModeHeight : _szMinDialog.cy) + _szBorder.cy;
mmi->ptMinTrackSize.y = h;
mmi->ptMaxTrackSize.y = h;
return 0;
return TRUE;
}
case WM_SIZE:
{
resizeDialogElements(LOWORD(lParam));
::SendMessage(_statusBar.getHSelf(), WM_SIZE, 0, 0); // pass WM_SIZE to status bar to automatically adjusts its size
return TRUE;
}
@ -2398,22 +2397,12 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA
LONG w = rc.right - rc.left;
bool& isLessModeOn = NppParameters::getInstance().getNppGUI()._findWindowLessMode;
isLessModeOn = !isLessModeOn;
long dlgH = isLessModeOn ? _lesssModeHeight : _initialWindowRect.bottom;
long dlgH = (isLessModeOn ? _lesssModeHeight : _szMinDialog.cy) + _szBorder.cy;
DIALOG_TYPE dlgT = getCurrentStatus();
calcAndSetCtrlsPos(dlgT, true);
// For unknown reason, the original default width doesn't make the status bar moveed
// Here we use a dirty workaround: increase 1 pixel so WM_SIZE message will be triggered
if (w == _initialWindowRect.right)
w += 1;
::SetWindowPos(_hSelf, nullptr, 0, 0, w, dlgH, SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW); // WM_SIZE message to call resizeDialogElements - status bar will be reposition correctly.
// Reposition the status bar
constexpr UINT flags = SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOCOPYBITS | SWP_FRAMECHANGED;
::GetClientRect(_statusBar.getHSelf(), &rc);
::SetWindowPos(_statusBar.getHSelf(), nullptr, 0, 0, w, rc.bottom, flags);
::SetWindowPos(_hSelf, nullptr, 0, 0, w, dlgH, SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);
hideOrShowCtrl4reduceOrNormalMode(dlgT);
@ -4483,18 +4472,20 @@ void FindReplaceDlg::calcAndSetCtrlsPos(DIALOG_TYPE dlgT, bool fromColBtn)
if (fromColBtn)
{
LONG yColBtn = 0;
RECT rc2ModeCheck{};
getMappedChildRect(IDC_2_BUTTONS_MODE, rc2ModeCheck);
LONG yColBtn = btnGap / 2;
if (isNotLessMode)
{
RECT rcSlider{};
getMappedChildRect(IDC_PERCENTAGE_SLIDER, rcSlider);
yColBtn = rcSlider.top + btnGap;
yColBtn += rcSlider.top;
}
else
{
yColBtn = rcBtn2ndPos.top + btnGap / 2;
yColBtn += rcBtn2ndPos.top;
}
::SetWindowPos(::GetDlgItem(_hSelf, IDD_RESIZE_TOGGLE_BUTTON), nullptr, rcBtn2ndPos.right + btnGap, yColBtn, 0, 0, SWP_NOSIZE | flags);
::SetWindowPos(::GetDlgItem(_hSelf, IDD_RESIZE_TOGGLE_BUTTON), nullptr, rc2ModeCheck.left, yColBtn, 0, 0, SWP_NOSIZE | flags);
}
}

View File

@ -412,8 +412,10 @@ protected :
void combo2ExtendedMode(int comboID);
private :
RECT _initialWindowRect{};
private:
SIZE _szMinDialog{};
SIZE _szBorder{};
LONG _deltaWidth = 0;
LONG _initialClientWidth = 0;
LONG _lesssModeHeight = 0;

View File

@ -19,7 +19,7 @@
#include <windows.h>
#include "FindReplaceDlg_rc.h"
IDD_FIND_REPLACE_DLG DIALOGEX 0, 0, 392, 200
IDD_FIND_REPLACE_DLG DIALOGEX 0, 0, 391, 197
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
CAPTION "Replace"
@ -60,13 +60,13 @@ BEGIN
GROUPBOX "",IDC_REPLACEINSELECTION,192,50,180,23
CONTROL "In select&ion",IDC_IN_SELECTION_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,58,59,10
PUSHBUTTON "",IDC_FINDPREV,278,20,18,14,WS_GROUP | BS_MULTILINE
PUSHBUTTON "",IDC_FINDNEXT,299,20,70,14,WS_GROUP | BS_MULTILINE
PUSHBUTTON "",IDC_FINDPREV,278,20,17,14,WS_GROUP
PUSHBUTTON "",IDC_FINDNEXT,299,20,70,14,WS_GROUP
PUSHBUTTON "Find Next",IDOK,278,20,91,14,WS_GROUP
CONTROL "",IDC_2_BUTTONS_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,373,22,14,10
PUSHBUTTON "Coun&t",IDCCOUNTALL,278,38,91,14
PUSHBUTTON "Find All in Current &Document",IDC_FINDALL_CURRENTFILE,278,56,91,21,BS_MULTILINE
PUSHBUTTON "Find All in All &Opened Documents",IDC_FINDALL_OPENEDFILES,278,80,91,21,BS_MULTILINE
PUSHBUTTON "Find All in All &Opened Documents",IDC_FINDALL_OPENEDFILES,278,81,91,21,BS_MULTILINE
PUSHBUTTON "&Replace",IDREPLACE,278,38,91,14
PUSHBUTTON "Replace &All",IDREPLACEALL,278,56,91,14
@ -82,15 +82,15 @@ BEGIN
PUSHBUTTON "Clear all marks",IDC_CLEAR_ALL,278,38,91,14
PUSHBUTTON "Copy Marked Text",IDC_COPY_MARKED_TEXT,278,56,91,14
PUSHBUTTON "Close",IDCANCEL,278,98,91,14
PUSHBUTTON "Close",IDCANCEL,278,106,91,14
GROUPBOX "",IDC_TRANSPARENT_GRPBOX,268,131,99,48
CONTROL "Transparenc&y",IDC_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,264,131,80,10
GROUPBOX "",IDC_TRANSPARENT_GRPBOX,268,131,101,48
CONTROL "Transparenc&y",IDC_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,131,80,10
CONTROL "On losing focus",IDC_TRANSPARENT_LOSSFOCUS_RADIO,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,278,143,85,10
CONTROL "Always",IDC_TRANSPARENT_ALWAYS_RADIO,"Button",BS_AUTORADIOBUTTON ,278,155,85,10
CONTROL "",IDC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TRANSPARENTBKGND | NOT WS_VISIBLE | WS_TABSTOP,275,166,85,10
CONTROL "",IDC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TRANSPARENTBKGND | WS_TABSTOP,275,166,85,10
PUSHBUTTON "",IDD_RESIZE_TOGGLE_BUTTON,375,171,16,14
PUSHBUTTON "",IDD_RESIZE_TOGGLE_BUTTON,373,168,16,14
END
IDB_INCREMENTAL_BG BITMAP "../icons/incrementalBg.bmp"