Разница между GetDC () и BeginPaint()

Я работаю над Win32 UI. Я хочу знать разницу между GetDC и BeginPaint. Когда использовать какой API и когда не использовать какой API.

3 ответов


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

примеры того, когда использовать каждый? BeginPaint чаще всего встречается внутри обработчиков WM_PAINT (MSDN: приложение не должно вызывать BeginPaint за исключением ответ на сообщение WM_PAINT. Каждый вызов BeginPaint должен иметь соответствующий вызов функции EndPaint.). GetDC можно использовать в любом месте, поэтому, если вы хотите рисовать на внешнем окне. В основном в любое время это не в обработчике WM_PAINT. BeginPaint и EndPaint также оказывают некоторое влияние на каретку. Подробнее читайте в msdn.


GetDC () is не заменитель Begin+EndPaint (). Если вы попытаетесь, вы обнаружите, что ваш поток пользовательского интерфейса начинает записывать 100% CPU core и ваш обработчик WM_PAINT вызывается снова и снова.

большой BeginPaint(), он очищает область обновления окна. Значение PAINTSTRUCT.rcPaint. WM_PAINT генерируется до тех пор, пока окно имеет грязный прямоугольник, созданный вызовом InvalidateRect () либо оконным менеджером, либо вашей программой явно называя его. BeginPaint() очищает его.


BeginPaint предназначен для вызова только в ответ на WM_PAINT сообщение. Контекст устройства, полученный им, указывает на недействительную (подлежащую перерисовке) область окна. Следует затем вышел через EndPaint.

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