Какое сообщение обрабатывается в процессе сворачивания или разворачивания окна?

Я хочу самостоятельно нарисовать строку заголовка окна с помощью MFC. Поэтому я переопределяю метод OnNcPaint() CMainFrame. Все кажется в порядке, пока я не щелкну элемент в меню управления, чтобы свернуть или развернуть его. Во время процесса минимизации или максимизации я вижу исходную строку заголовка. Я не знаю, почему это произошло. Может быть, есть какие-то сообщения, которые я не обработал в процессе? Нужна ваша помощь. Большое спасибо!


person user26404    schedule 24.12.2008    source источник


Ответы (4)


Во время процесса сворачивания/разворачивания? Похоже на анимацию мин/макс. Вы можете убедиться в этом, отключив анимацию через Мой компьютер > Свойства > Дополнительно > Параметры (производительность).

Что касается вопроса заголовка, вы получите WM_SIZE. Ознакомьтесь с документацией для CWnd::OnSize.

CMyDialog::OnSize(UINT nType, int cx, int cy)
{
    switch (nType)
    {
        case SIZE_MAXIMIZED:
            // window was maximized
            break;

        case SIZE_MINIMIZED:
            // window was minimized
            break;

        case SIZE_RESTORED:
            // misleading - this occurs when restored from minimized/maximized AND
            // for normal size operations when already restored
            break;

        default:
            // you could also deal with SIZE_MAXHIDE and SIZE_MAXSHOW
            // but rarely need to
            break;
    }
}
person Aidan Ryan    schedule 24.12.2008

Вы можете использовать Spy++, чтобы увидеть, какие сообщения получило окно. У меня смутные воспоминания о том, что OnSize приходил раньше, чем некоторые сообщения, которые я ожидал.

person Windows programmer    schedule 24.12.2008

OnShow вызывается раньше. OnSize вызывается после..
Я думаю, что значения SW_MAXIMIZE и SW_MINIMIZE..

Также есть способ сделать так, чтобы ваше приложение не заботилось о настройках анимации в Windows.
Там есть статья о добавлении вашего приложения на панель задач в свернутом виде, которая прекрасно иллюстрирует рисунок. Прошли годы с тех пор, как я использовал его, но если вы сможете найти его, вы будете золотым.

person baash05    schedule 28.12.2008

Вы говорите об анимации окна, верно? Где показано, что окно «растет» или «сжимается» от своего текущего размера и положения до максимального размера или до панели задач.

Эта анимация выполняется независимо от внешнего вида вашего окна. Вы можете вызвать функцию DrawAnimatedRectsAPI, чтобы запустить анимацию самостоятельно. Он просто рисует обычную строку заголовка в соответствии с текущими настройками отображения.

Обратите внимание, что другие окна с пользовательскими полосами заголовков ведут себя точно так же. Посмотрите, например, на различные версии Office. При минимизации или максимизации отображается строка заголовка Windows, а не строка заголовка клиента. Вы также можете увидеть аномалии при изменении размера окон, которые не занимают весь экран. Например, при максимизации игры Hearts анимация показывает, что окно расширяется на всю ширину экрана, но когда анимация заканчивается, окно уже (но все еще развернуто).

Итак, чтобы ответить на ваш вопрос, сообщение не отправляется. Анимация изменения размера выполняется оконным менеджером без какой-либо помощи или участия изменяемого размера окна. Что касается вашей программы, то окно сразу переходит от исходного размера к новому размеру.

person Rob Kennedy    schedule 04.01.2009