Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.3.4 Структурирование вашей программы для рисования

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

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

Вначале вы можете возмутиться по поводу этого высказывания, поскольку это так непохоже на нормальное программирование для PC. Нельзя отрицать, что иногда рисование в ответ на другие, отличные от WM_PAINT сообщения гораздо более удобно. (Программа KEYLOOK, которую мы разберем позже — именно такой пример). Но во многих случаях это просто не нужно, и, поскольку вы теперь специалист в области сбора всей необходимой для рисования информации в ответ на сообщение WM_PAINT, вы должны быть довольны результатами своей работы. Однако, вашей программе часто будет необходимо перерисовать только отдельную область экрана при обработке другого, отличного от WM_PAINT сообщения. В таком случае становится удобной функция InvalidateRect. Вы можете использовать ее, чтобы делать недействительными конкретные прямоугольные зоны рабочей области или рабочую область в целом.

Для некоторых приложений может оказаться недостаточным просто пометить некоторые зоны окна как недействительные для выработки сообщения WM_PAINT. После вызова функции InvalidateRect, Windows помещает сообщение WM_PAINT в очередь сообщений, и оконная процедура в конце концов его обрабатывает.

Однако, Windows обращается с сообщениями WM_PAINT как с сообщениями, имеющими наименьший приоритет, поэтому, если в системе происходит множество каких-то событий, то эти события могут произойти до того, как оконная процедура получит сообщения WM_PAINT. Каждый из вас видел в программах пустые белые "дыры", появляющиеся на месте окон диалога.

Если вы хотите немедленно обновить недействительную область, вы можете после вызова функции InvalidateRect вызвать UpdateWindow:

UpdateWindow(hwnd);

Вызов UpdateWindow приводит к немедленному вызову оконной процедуры с сообщением WM_PAINT в случае, если существует какая-либо недействительная зона в рабочей области окна. (Если вся рабочая область действительна, вызова оконной процедуры не произойдет.) Такие сообщения WM_PAINT минуют очередь сообщений. Оконная процедура вызывается прямо из Windows. После того как оконная процедура завершает перерисовку, она заканчивает свою работу, и Windows возвращает управление в программу на следующую после вызова UpdateWindow инструкцию.

Заметьте, что UpdateWindow — это та же самая функция, которая использовалась в WinMain для выработки первого сообщения WM_PAINT. При создании окна вся рабочая область является недействительной. UpdateWindow заставляет оконную процедуру перерисовать ее.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]