В данном случае контекст, полученный вызовом функции 6еЮС(), в качестве области отсечения использует не окно в целом, а видимую часть окна. Реализация функций вывода примитивов обеспечивает отсечение не по границам прямоугольного окна, а по формируемой области, которая может иметь довольно сложную форму.
В таком техническом решении также есть определенные недостатки. Сложно отключить в алгоритмах рисования операции отсечения в тех случаях, когда оно заведомо не потребуется, и тем ускорить работу графики.
Формирование статических изображений Рассмотренная выше организация вывода изображений не позволяет получать информацию о дефектной области и перерисовывать только ту часть окна, которая нуждается в обновлении. Система автоматически формирует и учитывает при выводе примитивов ограничения области видимости в окне. Но идеология Windows предусматривает для отсечения примитивов формирование более узкой, чем видимая часть окна, области. Перерисовывается не вся видимая часть окна, а ее пересечение с дефектной областью окна. Действительно, нет смысла перерисовывать то, что не изменялось.
Для реализации этой возможности операционная система проверяет наличие в окне дефектной области (она же update region - область обновления). Если такая область есть, система помещает в очередь сообщения WM_NCPAINT, WM_ERASEBKGROUND и WM__PAINT. Поскольку в очереди нет смысла хранить более одного сообщения WM_PAINT, для него выделен отдельный однобитный флаг [3].
В результате оконная процедура получит несколько сообщений: 1. Сообщение WM_NCPAINT, которое указывает, что надо восстановить служебные регионы окна, такие как рамка и заголовок. Поскольку приложение не рисовало рамку и область заголовка, оно обычно не обрабатывает это сообщение. Сообщение поступит в функцию DefWindowProc(), которая восстановит рамку. Чтобы
Рис. 3.2. Отсечение по видимой области Формирование статических изображений не рисовать всю служебную часть, в параметре wParam сообщения WM_NCPAINT содержится дескриптор дефектной области окна.