Контекст по сообщению ЫМ_РА1ЫТ можно получать при помощи функции 6е10С(1пи/пс1), как это показано в листинге 3.11.

Формирование статических изображений Листинг 3.11

case WM_PAINT:
ps.hdc - GetDC(hWnd);
Rotatel_ine(ps.hdc.ps.f Erase):
ReleaseDC(hWnd. ps.hdc): break;

В этом случае картинка будет обновляться полностью. Это подтверждает, что в контексте, полученном GetDC(hWnd), область отсечения совпадает не с дефектной, а с видимой областью окна.

Система ставит WM_PAINT в очередь, если в окне есть непустая область, требующая перерисовки. Важно помнить, что функции Begi nPai nt() и DefWi ndowProc() объявляют дефектную область пустой и тем самым предотвращают повторный приход сообщения WMPAINT. Попробуйте в последнем фрагменте заменить оператор break на return 0, и вы увидите, как колесо помчится по экрану из-за постоянного прихода сообщений WM_PAI NT. Вызов GetDC (hWnd) не уничтожает дефектную область, которая является источником этих сообщений.

Функции, которая подобно RotateLineC) объединяет в себе отображение объекта и моделирование его поведения, трудно придумать другое полезное применение, кроме демонстрации отсечения по дефектной области. Поступление сообщения WM_PAINT должно восстанавливать изображение, но не должно запускать модель и изменять положение объекта. Модель движения можно отделить от рисования и запускать ее по таймеру, но тогда модель должна определять, какая часть окна в результате перемещения объекта требует обновления, и сообщения WM_PAI NT должны посылаться из функции моделирования, а не только в результате манипуляций мышью. Для этого модель может использовать предоставляемые API Windows функции InvalidateRectO, InvalidateRgnO, ValidateRectO и многие другие.

Выполнить ветвь case WM_PAINT оконной процедуры можно также вызовом функции SendMessage(hWnd, WM_PAINT ,0,0). Напомним, что SendMessageC) не ставит сообщение в очередь, она сразу же вызовет оконную процедуру и передаст ей сообщение WM_PAINT, чтобы выполнить рисование. Аналогично работает функция UpdateWin-dow(hWnd), но она предварительно проверяет наличие в окне дефектной области. Если ее нет, то UpdateWindowC) не вызывает оконную процедуру. Если дефектная область есть, то функция вызывает оконную процедуру дважды. Сначала она передает сообщение WM_ERASEBKGND, а потом - WM_PAINT.


⇐ Предыдущая| |Следующая ⇒