From cdc67e80ac78d08aee04bbc55ece650579beba6c Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Fri, 19 Jun 2020 16:48:18 +0200 Subject: add functions for centering a toplevel window on the monitor --- alf/alftoplevel.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'alf/alftoplevel.cpp') 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) { -- cgit v1.2.3