Есть ли что-то особенное в использовании BeginPaint/EndPain, а не GetDC/ReleaseDC в ответ на сообщение WM_PAINT?

Можно использовать GetDC/ReleaseDC для рисования в клиентской области окна. Но в ответ на сообщение WM_PAINT нужно использовать BeginPaint/EndPaint. В этом есть что-то особенное?

3 ответа

Решение

Сообщение WM_PAINT выдается, когда необходимо обновить часть окна. Указывая BeginPaint/EndPaint(), вы сообщаете gdi, что вы действительно выполняете эту работу. Если вы не вызовете BeginPaint () для указанного региона, сообщения WM_PAINT будут генерироваться до тех пор, пока кто-то не обновит их. Функция дает вам DC только потому, что это удобно. Внутренне BeginPaint()/EndPaint(), вероятно, вызывают GetDC()/ReleaseDC().

В отличие от GetDC и ReleaseDC, вы говорите GDI, что вы сейчас собираетесь что-то нарисовать на DC, без запроса gdi.

Да, конечно. BeginPaint() извлекает область обновления и автоматически выполняет ее очистку. Если вы используете GetDC(), вы заметите, что ваша программа сжигает ядро ​​на 100%, многократно запускает обработчик WM_PAINT, потому что область обновления никогда не очищалась. Вы должны были бы вызвать ValidateRect(), чтобы избежать этого.

Функция BeginPaint автоматически устанавливает область отсечения контекста устройства, поэтому, если нужно перерисовать только часть вашего окна, оно не будет перерисовывать все окно.

Другие вопросы по тегам