Сообщение WM_PAINT

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

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

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

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

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

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

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