Как правило, приложение рисует в окне в ответ на сообщение WM_PAINT. Система посылает это сообщение оконной процедуре, когда изменяет в окне переделанное содержимое рабочей области. Система посылает сообщение только тогда, если нет никаких других сообщений в очереди сообщений прикладной программы.
После получения сообщения WM_PAINT приложение может вызвать функцию BeginPaint, чтобы извлечь контекст устройства (DC) отображения для рабочей области и использовать его при вызовах функций GDI, которые выполняют любые операции рисования, необходимые, чтобы обновлять рабочую область. После завершения операций рисования приложение вызывает функцию EndPaint, чтобы освободить контекст устройства (DC) отображения.
Перед тем, как BeginPaint возвратит контекст устройства (DC) отображения, система готовит его для заданного окна. Функция сначала устанавливает регион отсечения для контекста устройства равной отсеченной части окна, которое нуждается в обновлении и части, которая видима для пользователя. Перерисовываются только те части окна, которые изменились. Попытки рисовать вне этого региона обрезаются и не показываются на экране.
Система может также послать оконной процедуре сообщения WM_NCPAINT и WM_ERASEBKGND перед тем, как BeginPaint возвращает значение. Эти сообщения предписывают программе рисовать фон и нерабочую область окна. Нерабочая область (nonclient area) - часть окна, которая находятся за пределами рабочей области. Эта область включает в себя такие детали как область заголовка, меню окна (известное также нам как меню System) и полосы прокрутки. Большинство приложений опирается на функцию окна по умолчанию - DefWindowProc, чтобы рисовать эту область и после этого передать сообщение WM_NCPAINT в эту функцию. Фон окна (window background) - это цвет или узор, которым окно закрашивается с перед началом других операций рисования. Фон закрывает любые изображения ранее расположенные в окне или на экране под окном. Если окно принадлежит к классу окна, имеющего класс кисти фона, функция DefWindowProc рисует фон окна автоматически.
BeginPaint заполняет структуру PAINTSTRUCT информацией, такой как размеры части окна, которое будет обновлено и флажок, указывающий рисовался ли фон окна. Приложение может использовать эту информацию, чтобы оптимизировать рисование. Например, оно может использовать размеры обновленного региона, установленного членом rcPaint структуры, ограничить рисование только теми частями окна, которые нуждаются в обновлении. Если у приложения очень простой вывод данных, оно может проигнорировать обновляемый регион и рисовать во всем окне, полагаясь на систему, которая сбрасывает (обрезает) любой ненужный вывод данных. Поскольку система обрезает рисование, которое простирается вне региона отсечения, рисуется только то, что находится в видимой части обновляемого региона.
BeginPaint устанавливает обновляемый регион в окна в NULL. Она очищает регион, препятствуя тому, чтобы генерировать последующие сообщения WM_PAINT. Если приложение обрабатывает сообщение WM_PAINT, но не вызывает BeginPaint или, в противном случае, очищает обновляемый регион, приложение продолжает получать сообщения WM_PAINT до тех пор, пока регион не пуст. Во всех случаях приложение должно очистить обновляемый регион перед тем, как возвратится из сообщения WM_PAINT.
После того, как программа закончит рисовать, она должно вызвать функцию EndPaint. Для большинства окон EndPaint освобождает контекст устройства (DC) отображения, делая его доступным для других окон. EndPaint также показывает каретку (символ ">"), если она была раньше скрыта функцией BeginPaint. BeginPaint скрывает каретку для того, чтобы не дать операции рисования разрушить её.
Более подробно материал рассматривается в нижеперечисленных статьях: