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

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

Ответы [ 3 ]

9 голосов
/ 13 августа 2011

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

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

5 голосов
/ 13 августа 2011

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

4 голосов
/ 13 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...