Когда нужно рисовать в окне
Приложение отображает содержимое окна в различных ситуациях: при создании окна, при изменении его размера, при перемещении окна из-за другого окна, при минимизации или максимизации окна, при отображении данных из открытого файла, а также при прокрутке, изменении или выборе части отображаемых данных.
Система управляет такими действиями, как перемещение и изменение размера окна. Если действие влияет на содержимое окна, система помечает затронутую часть окна как готовую к обновлению и при следующей возможности отправляет сообщение WM_PAINT в процедуру окна. Сообщение служит сигналом для приложения, чтобы определить, что нужно обновить, и выполнить необходимую отрисовку.
Некоторые действия управляются приложением, например отображение открытых файлов и выбор отображаемых данных. Для этих действий приложение может пометить для обновления часть окна, затронутую действием, что приводит к отправке сообщения WM_PAINT при следующей возможности. Если действие требует немедленной обратной связи, приложение может рисовать в процессе выполнения действия, не ожидая WM_PAINT. Например, обычное приложение выделяет область, выбранную пользователем, а не дожидаясь следующего сообщения WM_PAINT, чтобы обновить область.
Во всех случаях приложение может рисовать в окне сразу после создания. Чтобы рисовать в окне, приложение должно сначала получить дескриптор контекста устройства отображения окна. В идеале приложение выполняет большую часть операций рисования во время обработки WM_PAINT сообщений. В этом случае приложение получает контекст отображаемого устройства, вызывая функцию BeginPaint. Если приложение рисует в любое другое время, например из WinMain или во время обработки сообщений клавиатуры или мыши, оно вызывает функцию GetDC или GetDCEx для получения контекста устройства (DC).