2015-02-03 2 views
1

У меня есть настройка нескольких мониторов. Когда окно увеличивается на дополнительном мониторе, мне нужно ограничить максимальный размер и положение.Ограничить максимальный размер окна в дополнительном мониторе

В MSDN документация для MINMAXINFO упоминает следующее:

Для систем с несколькими мониторами, члены ptMaxSize и ptMaxPosition описывают максимизируется размер и положение окна на основном мониторе, даже если окно в конечном счете, максимизируется на вторичном мониторе. В этом случае диспетчер окон настраивает эти значения, чтобы компенсировать различия между основным монитором и монитором, который отображает окно. Таким образом, если пользователь оставляет ptMaxSize нетронутым, окно на мониторе, превышающем основной монитор, максимизируется до размера большего монитора.

Итак, я попытался ограничение, делая SetWindowPos в OnSysCommand если nId является SC_MAXIMIZE. Он работает, когда пользователь нажимает кнопку максимизации/дважды щелкните строку заголовка.

Но, когда пользователь использует клавишу «Стрелка вверх» или «Вверх» вверху монитора, чтобы максимизировать, я не могу справиться с ограничением максимального размера.

Итак, есть ли какое-нибудь общее место для обработки всех моих сценариев?

Есть ли способ сделать трюк при получении WM_GETMINMAXINFO сообщение.

+0

Вместо OnSysCommand попробуйте использовать OnSize. – HariDev

+0

thanx, он работал с использованием OnSize – user2338040

ответ

1

Я знаю, что это сообщение устарело, но я хочу поделиться своим кодом для тех, кто все еще нуждается в решении.

void CMyDialog::OnWindowPosChanging(WINDOWPOS * pos) 
{ 
    //let us do the default processing first 
    CDialogEx::OnWindowPosChanging(pos); 

    //We are only interested in setting the window size when our window is in maximized state. 
    //When maximized, the window will have a WS_MAIMIZE window style set 
    LONG_PTR lWndStyle = GetWindowLongPtr(this->m_hWnd, GWL_STYLE); 
    if ((lWndStyle & WS_MAXIMIZE) != WS_MAXIMIZE) 
     return; 

    //Use the proposed window from OS to identify the monitor. 
    //I found that, the MonitorFromWindow() API returns primary monitor info when I restore a minimized window from taskbar. 
    RECT rectWnd = {pos->x, pos->y, pos->x + pos->cx, pos->y + pos->cy}; 
    HMONITOR hMon = MonitorFromRect(&rectWnd, MONITOR_DEFAULTTONEAREST); 

    MONITORINFO info; 
    info.cbSize = sizeof(info); 
    GetMonitorInfo(hMon, &info); 

    LONG nMaxWndWidth = (info.rcWork.right - info.rcWork.left); 
    LONG nMaxWndHeight = (info.rcWork.bottom - info.rcWork.top); 

    //The window and workspace height can be > or < 
    if (pos->cy != nMaxWndHeight) 
    { 
     pos->cy = nMaxWndHeight; 
    } 

    //The window and workspace width can be > or < 
    if (pos->cx != nMaxWndWidth) 
    { 
     pos->cx = nMaxWndWidth; 
    } 
} 
+0

Wonderful - огромное спасибо! – RichieHindle

Смежные вопросы