Может возникнуть вопрос - зачем знать эти детали, если, в конечном счете, все выглядит так, будто операционная система сначала посылает WM_ERASEBKGND для стирания изображения, а потом WMJVUNT - для его восстановления? Если приложение самостоятельно обрабатывает WM_ERASEBKGND, разработчик должен учитывать прерывание и повторный вызов оконной процедуры, чтобы не допустить ошибок, связанных с некорректным использованием глобальных переменных.

Особенности обработки системой дефектной области, созданной вызовом Inva-1 idateRect(), проявятся, если в рассмотренном примере заменить BeginPaintC) и EndPaintC) функциями GetDCC) и ReleaseDCC). Чтобы не писать новую программу, можно переставить комментарии в рассмотренном выше примере. В этом случае по щелчку правой кнопкой вместо прямоугольника будет отображено чистое окно.

Элементы компьютерной графики

И только если процессор работает очень медленно, можно заметить в окне быстро промелькнувший прямоугольник. Дело в том, что ни система, ни функция GetDCC ) не порождают сообщения WM_ERASEBKGND. И только после того, как прямоугольник будет нарисован, управление попадет обработчику по умолчанию DefWi ndowProcC ), который сделает то же, что и BeginPaintC ), то есть вызовет стирание окна, послав ему WM_ERASEBKGND, и уничтожит дефектную область. Понимая происходящие процессы, можно при желании получить изображение, пользуясь функцией GetDCC ). Для этого достаточно вызвать обработку по умолчанию не после, а до запроса контекста, как показано в листинге 3.13.

Листинг 3.13

case WM_PAINT:

{int R - DefWindowProc(hWnd.message.wParam.lParam); //Очистка окна. HDC hdc - GetDC(hWnd): static int i - 0; i+ - 10;

RectangleChdc.i,i.i+50.i+30); //Рисование прямоугольника. ReleaseDC(hWnd.hdc):

return R; //Возврат результата работы DefWindowProcC).

}

Вызвав функцию InvalidateRect( ) несколько раз подряд, можно задать обновляемый регион сложной формы. Каждая новая область, задаваемая функцией Inval i dateRect С ) до обработки WM_PAINT, не заменяет предыдущую, а объединяется с ней. При этом в структуру PAINTSTRUCT будут заноситься габариты обновляемой области, но стирание и отсечение система производит не по габаритному прямоугольнику, а по сформированной фигуре сложной формы.


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