void CDialog::NormalizeSize(bool fullNormalize) { RECT workRect; GetWorkAreaRect(&workRect); int xSize = RECT_SIZE_X(workRect); int ySize = RECT_SIZE_Y(workRect); RECT rect; GetWindowRect(&rect); int xSize2 = RECT_SIZE_X(rect); int ySize2 = RECT_SIZE_Y(rect); bool needMove = (xSize2 > xSize || ySize2 > ySize); if (xSize2 > xSize || (needMove && fullNormalize)) { rect.left = workRect.left; rect.right = workRect.right; xSize2 = xSize; } if (ySize2 > ySize || (needMove && fullNormalize)) { rect.top = workRect.top; rect.bottom = workRect.bottom; ySize2 = ySize; } if (needMove) { if (fullNormalize) Show(SW_SHOWMAXIMIZED); else Move(rect.left, rect.top, xSize2, ySize2, true); } }
void CDialog::NormalizePosition() { RECT workRect, rect; GetWorkAreaRect(&workRect); GetWindowRect(&rect); if (rect.bottom > workRect.bottom && rect.top > workRect.top) Move(rect.left, workRect.top, RECT_SIZE_X(rect), RECT_SIZE_Y(rect), true); }
bool IsDialogSizeOK(int xSize, int ySize) { // it returns for system font. Real font uses another values LONG v = GetDialogBaseUnits(); int x = LOWORD(v); int y = HIWORD(v); RECT rect; GetWorkAreaRect(&rect); int wx = RECT_SIZE_X(rect); int wy = RECT_SIZE_Y(rect); return xSize / 4 * x <= wx && ySize / 8 * y <= wy; }
void CMonitor::ClipRectToMonitor( LPRECT lprc, const BOOL UseWorkAreaRect ) const { int w = lprc->right - lprc->left; int h = lprc->bottom - lprc->top; CRect rect; if ( UseWorkAreaRect ) GetWorkAreaRect( &rect ); else GetMonitorRect( &rect ); lprc->left = max( rect.left, min( rect.right - w, lprc->left ) ); lprc->top = max( rect.top, min( rect.bottom - h, lprc->top ) ); lprc->right = lprc->left + w; lprc->bottom = lprc->top + h; }
//these two center methods are adapted from David Campbell's //MSJ article (see comment at the top of the header file) void CMonitor::CenterRectToMonitor( LPRECT lprc, const BOOL UseWorkAreaRect ) const { int w = lprc->right - lprc->left; int h = lprc->bottom - lprc->top; CRect rect; if ( UseWorkAreaRect ) GetWorkAreaRect( &rect ); else GetMonitorRect( &rect ); lprc->left = rect.left + ( rect.Width() - w ) / 2; lprc->top = rect.top + ( rect.Height() - h ) / 2; lprc->right = lprc->left + w; lprc->bottom = lprc->top + h; }
void EnsureAreaVisibility(RectI& r) { // adjust to the work-area of the current monitor (not necessarily the primary one) RectI work = GetWorkAreaRect(r); // make sure that the window is neither too small nor bigger than the monitor if (r.dx < MIN_WIN_DX || r.dx > work.dx) r.dx = (int)min(work.dy * DEF_PAGE_RATIO, work.dx); if (r.dy < MIN_WIN_DY || r.dy > work.dy) r.dy = work.dy; // check whether the lower half of the window's title bar is // inside a visible working area int captionDy = GetSystemMetrics(SM_CYCAPTION); RectI halfCaption(r.x, r.y + captionDy / 2, r.dx, captionDy / 2); if (halfCaption.Intersect(work).IsEmpty()) r = RectI(work.TL(), r.Size()); }
/* Ensure that the rectangle is at least partially in the work area on a monitor. The rectangle is shifted into the work area if necessary. */ RectI ShiftRectToWorkArea(RectI rect, bool bFully) { RectI monitor = GetWorkAreaRect(rect); if (rect.y + rect.dy <= monitor.y || bFully && rect.y < monitor.y) /* Rectangle is too far above work area */ rect.Offset(0, monitor.y - rect.y); else if (rect.y >= monitor.y + monitor.dy || bFully && rect.y + rect.dy > monitor.y + monitor.dy) /* Rectangle is too far below */ rect.Offset(0, monitor.y - rect.y + monitor.dy - rect.dy); if (rect.x + rect.dx <= monitor.x || bFully && rect.x < monitor.x) /* Too far left */ rect.Offset(monitor.x - rect.x, 0); else if (rect.x >= monitor.x + monitor.dx || bFully && rect.x + rect.dx > monitor.x + monitor.dx) /* Too far right */ rect.Offset(monitor.x - rect.x + monitor.dx - rect.dx, 0); return rect; }
static bool CreatePropertiesWindow(HWND hParent, PropertiesLayout* layoutData) { CrashIf(layoutData->hwnd); HWND hwnd = CreateWindow( PROPERTIES_CLASS_NAME, PROPERTIES_WIN_TITLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, ghinst, NULL); if (!hwnd) return false; layoutData->hwnd = hwnd; layoutData->hwndParent = hParent; ToggleWindowStyle(hwnd, WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT, IsUIRightToLeft(), GWL_EXSTYLE); // get the dimensions required for the about box's content RectI rc; PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); UpdatePropertiesLayout(layoutData, hdc, &rc); EndPaint(hwnd, &ps); // resize the new window to just match these dimensions // (as long as they fit into the current monitor's work area) WindowRect wRc(hwnd); ClientRect cRc(hwnd); RectI work = GetWorkAreaRect(WindowRect(hParent)); wRc.dx = min(rc.dx + wRc.dx - cRc.dx, work.dx); wRc.dy = min(rc.dy + wRc.dy - cRc.dy, work.dy); MoveWindow(hwnd, wRc.x, wRc.y, wRc.dx, wRc.dy, FALSE); CenterDialog(hwnd, hParent); ShowWindow(hwnd, SW_SHOW); return true; }