Поделиться через


Сообщение WM_PAINT

Как правило, приложение рисует в окне в ответ на сообщение WM_PAINT. Система отправляет это сообщение в обработчик окна, когда изменения в окне изменили содержимое области клиента. Система отправляет сообщение только в том случае, если в очереди сообщений приложения нет других сообщений.

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

Прежде чем BeginPaint возвращает контекст отображаемого устройства, система подготавливает контекст устройства к указанному окну. Сначала он задает область вырезки для контекста устройства, равного пересечению части окна, необходимой для обновления, и части, видимой пользователю. Перерисовываются только те части окна, которые изменились. Попытки рисования за пределами этого региона обрезаются и не отображаются на экране.

Система также может отправлять WM_NCPAINT и WM_ERASEBKGND сообщения в процедуру окна перед возвратом BeginPaint. Эти сообщения инструктируют приложение рисовать неклиентскую область и фон окна. неклиентная область является частью окна, которое находится за пределами клиентской области. Область включает такие функции, как строка заголовка, меню окна (также известное как меню system) и полосы прокрутки. Большинство приложений используют функцию окна по умолчанию, DefWindowProc, чтобы нарисовать эту область и, следовательно, передать WM_NCPAINT сообщение этой функции. Фон окна — это цвет или шаблон, заполненный окном перед началом других операций рисования. Фон охватывает все изображения ранее в окне или на экране под окном. Если окно принадлежит классу окна с фоновой кистью класса, функция DefWindowProc автоматически рисует фон окна.

BeginPaint заполняет структуру PAINTSTRUCT сведениями, такими как размеры части окна, которую необходимо обновить, и флаг, указывающий, был ли нарисован фон окна. Приложение может использовать эти сведения для оптимизации рисования. Например, он может использовать измерения области обновления, указанные элементом rcPaint, чтобы ограничить рисование только теми частями окна, которые нуждаются в обновлении. Если приложение имеет очень простые выходные данные, оно может игнорировать область обновления и рисовать во всем окне, полагаясь на систему, чтобы обрезать любые ненужные выходные данные. Поскольку система обрезает рисунки, выходящие за пределы региона обрезки, видны только те, которые находятся в зоне обновления.

BeginPaint задает область обновления окна на NULL. Это очищает область, предотвращая создание последующих WM_PAINT сообщений. Если приложение обрабатывает сообщение WM_PAINT, но не вызывает BeginPaint или иначе очищает регион обновления, приложение продолжает получать сообщения WM_PAINT, пока регион не пуст. Во всех случаях перед возвратом из сообщения WM_PAINT приложение должно очистить регион обновления.

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