2016-07-07 6 views
2

У меня есть приложение MFC SDI.
У этого есть Лента, статусные бары, свойства окна, ...Изменение клиентской области View

Мне нужно сделать клиентскую область зрения x % 16. Так что я не могу настроить все окно, но мне нужно изменить размер CMyView, чтобы быть делимым на 16 пикселей.

Есть ли способ сделать это?

Этот код не работает: = (

void CMyView::OnSize(UINT nType, int cx, int cy) 
{ 
    cx -= cx % 16; 
    cy -= cy % 16; 

    CView::OnSize(nType, cx, cy); 

    RECT wr = { 0, 0, cx, cy }; 
    AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); 
} 
+0

'AdjustWindowRect' ничего не регулирует, а лишь _calculates нужного размера окна прямоугольника, основываясь на желание клиента прямоугольника size_ (цитата из [документаций MS] (https: // MSDN .microsoft.com/ан-нас/библиотека/окна/рабочий стол/ms632665 (v = vs.85) .aspx)). И вызов 'CView :: OnSize' с другим размером не делает многого (не помните, в какой части документации я читал это). –

+0

Вы использовали [MoveWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633534 (v = vs.85) .aspx)? –

+0

Я нашел некоторое обходное решение: 1. Создайте дополнительное дочернее окно для представления; 2. При изменении размера выровняйте его на 16 пикселей и центрируйте его. –

ответ

3

Handling это WM_SIZE/OnSize слишком поздно, потому что окно уже изменен к тому времени Используйте ON_WM_WINDOWPOSCHANGING вместо того, чтобы отслеживать изменения размера окна и применить следующее. изменения:

void CMyWnd::OnWindowPosChanging(WINDOWPOS* wpos) 
{ 
    wpos->cx -= wpos->cx % 16; 
    wpos->cy -= wpos->cy % 16; 
    __super::OnWindowPosChanging(wpos); 
}