void WindowManager::resize(unsigned clientW, unsigned clientH) { HWND hwnd = ::GetActiveWindow(); // Store current window rect ::GetClientRect(hwnd, &prevWindowRect); // Get monitor size HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); MONITORINFO info; info.cbSize = sizeof(MONITORINFO); GetMonitorInfo(monitor, &info); int monitorWidth = info.rcMonitor.right - info.rcMonitor.left; int monitorHeight = info.rcMonitor.bottom - info.rcMonitor.top; // How much do we overlap or are smaller than the actual screen size int widthDiff = monitorWidth - (clientW ? clientW : prevWindowRect.right); int heightDiff = monitorHeight - (clientH ? clientH : prevWindowRect.bottom); RECT desiredRect; desiredRect.left = widthDiff / 2; desiredRect.top = heightDiff / 2; desiredRect.right = monitorWidth - (widthDiff / 2); desiredRect.bottom = monitorHeight - (heightDiff / 2); LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE); TrueAdjustWindowRect(&desiredRect, lStyle, false); TrueSetWindowPos(hwnd, NULL, desiredRect.left, desiredRect.top, desiredRect.right-desiredRect.left, desiredRect.bottom-desiredRect.top, SWP_NOZORDER); SDLOG(0, "Set Window rect to %s\n", RectToString(&desiredRect).c_str()); }
GENERATE_INTERCEPT_HEADER(AdjustWindowRect, BOOL, WINAPI, __inout LPRECT lpRect, __in DWORD dwStyle, __in BOOL bMenu) { return TrueAdjustWindowRect(lpRect, dwStyle, bMenu); }