WinAPI: Пропуск BeginPaint & amp; EndPaint в WM_PAINT вызывает использование процессора на 100%

При обработке сообщения WM_PAINT я пропустил вызовы BeginPaint и EndPaint, и загрузка ЦП возросла до 100%. Почему это?

Я также использую рабочие потоки … но они делают что-то другое и, кажется, не влияют на этот вопрос.

Кроме того, я могу использовать контекст устройства из GetDC (), а не BeginPaint? Кажется, у них разные ценности, поэтому я думал, что у них разные работы.

Извините, если я звучу как идиот — я новичок в WinAPI, C ++ и просто в мире логики в целом …

Спасибо

0

Решение

Это совершенно нормально. Windows генерирует сообщение WM_PAINT, когда область обновления вашего окна не пуста. Кто ты есть предполагаемый сделать, это пометить его снова пустым. Вы делаете это, например, вызывая Begin / EndPaint ().

Если нет, то Windows немедленно генерирует еще одно сообщение WM_PAINT, все еще пытаясь очистить регион обновления. Ваш поток сожжет 100% ядро, праздно обрабатывая сообщения WM_PAINT и фактически не выполняя работу. Может быть, вы на самом деле рисуете, Windows просто не знает, что вы нарисовали, и не пытается угадать.

Использование Begin / EndPaint () — очень разумный способ выполнить эту работу. Это не единственный способ, вы также можете вызвать ValidateRect () или ValidateRgn (). Пока вы «новичок в winapi», я настоятельно рекомендую вам сделать это обычным способом.

8

Другие решения

Не уверен, что это так, но beginpaint и endpaint также проверяют нарисованную область окна, если вы не используете их, то Windows не знает, что вы перерисовали эту область. Вы можете вызвать функцию ValidateRect, чтобы сообщить о том, что окно было перерисовано. ,

Не уверен, что это поможет в вашем случае, вы можете прочитать больше о tjis в следующем, так

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

3

GDI выдает сообщение WM_PAINT для обновления части окна. BeginPaint/EndPaint() сообщает gdi, что обработчик выполняет эту работу. При отсутствии BeginPaint () для указанного региона, до тех пор, пока окно не будет обновлено (кем-либо), будут генерироваться сообщения WM_PAINT. Это причина, почему вам нужно BeginPaint/EndPaint() в обработчике WM_PAINT и при отсутствии которого вы видите высокую загрузку процессора.

GetDC () не заменяет Begin + EndPaint () по причине, указанной в моем предыдущем абзаце.

1
По вопросам рекламы [email protected]