diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-19 16:48:18 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-19 16:48:18 +0200 |
| commit | cdc67e80ac78d08aee04bbc55ece650579beba6c (patch) | |
| tree | 13089be9354afbd6573ed001403dbdcf3423054e /alf/alftoplevel.cpp | |
| parent | 253b9857e7b4317275b50795ddc53508e1cbd181 (diff) | |
add functions for centering a toplevel window on the monitor
Diffstat (limited to 'alf/alftoplevel.cpp')
| -rw-r--r-- | alf/alftoplevel.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/alf/alftoplevel.cpp b/alf/alftoplevel.cpp index 11e8599..0747ea2 100644 --- a/alf/alftoplevel.cpp +++ b/alf/alftoplevel.cpp @@ -594,6 +594,69 @@ ALF_Toplevel_SetDefaultFont(HWND toplevel) SendMessage(toplevel, ALF_WM_TPLVL_SETDEFFONT, 0, 0); } +void +ALF_Toplevel_CenterOnMonitor(HWND toplevel, HMONITOR monitor) +{ + MONITORINFO mi; + ZeroMemory(&mi, sizeof(mi)); + mi.cbSize = sizeof(mi); + + if (ALF_Compat_GetMonitorInfoA(monitor, &mi)) { + MINMAXINFO i; + ZeroMemory(&i, sizeof(i)); + SendMessage(toplevel, WM_GETMINMAXINFO, 0, (LPARAM)&i); + + RECT rcWindow = {0,0,0,0}; + GetWindowRect(toplevel, &rcWindow); + + int width = rcWindow.right - rcWindow.left; + if (width < i.ptMinTrackSize.x) + width = i.ptMinTrackSize.x; + + int height = rcWindow.bottom - rcWindow.top; + if (height < i.ptMinTrackSize.y) + height = i.ptMinTrackSize.y; + + RECT rcTarget; + rcTarget.left = (mi.rcWork.left + mi.rcWork.right - width) / 2; + rcTarget.top = (mi.rcWork.top + mi.rcWork.bottom - height) / 2; + rcTarget.right = rcTarget.left + width; + rcTarget.bottom = rcTarget.top + height; + + OffsetRect(&rcTarget, mi.rcMonitor.left - mi.rcWork.left, mi.rcMonitor.top - mi.rcWork.top); + + WINDOWPLACEMENT wp; + ZeroMemory(&wp, sizeof(wp)); + wp.length = sizeof(wp); + + GetWindowPlacement(toplevel, &wp); + + wp.rcNormalPosition = rcTarget; + + SetWindowPlacement(toplevel, &wp); + } +} + +void +ALF_Toplevel_CenterOnCurrentMonitor(HWND toplevel) +{ + ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromWindow(toplevel, MONITOR_DEFAULTTONEAREST)); +} + +void +ALF_Toplevel_CenterOnOwnerMonitor(HWND toplevel) +{ + HWND hwndOwner = GetParent(toplevel); + ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromWindow(hwndOwner, MONITOR_DEFAULTTONEAREST)); +} + +void +ALF_Toplevel_CenterOnPrimaryMonitor(HWND toplevel) +{ + POINT ptZero = { 0, 0 }; + ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY)); +} + ALFApplication * ALF_CreateApplication(void) { |
