При обработке сообщения WM_PAINT я пропустил вызовы BeginPaint и EndPaint, и загрузка ЦП возросла до 100%. Почему это?
Я также использую рабочие потоки … но они делают что-то другое и, кажется, не влияют на этот вопрос.
Кроме того, я могу использовать контекст устройства из GetDC (), а не BeginPaint? Кажется, у них разные ценности, поэтому я думал, что у них разные работы.
Извините, если я звучу как идиот — я новичок в WinAPI, C ++ и просто в мире логики в целом …
Спасибо
Это совершенно нормально. Windows генерирует сообщение WM_PAINT, когда область обновления вашего окна не пуста. Кто ты есть предполагаемый сделать, это пометить его снова пустым. Вы делаете это, например, вызывая Begin / EndPaint ().
Если нет, то Windows немедленно генерирует еще одно сообщение WM_PAINT, все еще пытаясь очистить регион обновления. Ваш поток сожжет 100% ядро, праздно обрабатывая сообщения WM_PAINT и фактически не выполняя работу. Может быть, вы на самом деле рисуете, Windows просто не знает, что вы нарисовали, и не пытается угадать.
Использование Begin / EndPaint () — очень разумный способ выполнить эту работу. Это не единственный способ, вы также можете вызвать ValidateRect () или ValidateRgn (). Пока вы «новичок в winapi», я настоятельно рекомендую вам сделать это обычным способом.
Не уверен, что это так, но beginpaint и endpaint также проверяют нарисованную область окна, если вы не используете их, то Windows не знает, что вы перерисовали эту область. Вы можете вызвать функцию ValidateRect, чтобы сообщить о том, что окно было перерисовано. ,
Не уверен, что это поможет в вашем случае, вы можете прочитать больше о tjis в следующем, так
GDI выдает сообщение WM_PAINT для обновления части окна. BeginPaint/EndPaint()
сообщает gdi, что обработчик выполняет эту работу. При отсутствии BeginPaint () для указанного региона, до тех пор, пока окно не будет обновлено (кем-либо), будут генерироваться сообщения WM_PAINT. Это причина, почему вам нужно BeginPaint/EndPaint()
в обработчике WM_PAINT и при отсутствии которого вы видите высокую загрузку процессора.
GetDC () не заменяет Begin + EndPaint () по причине, указанной в моем предыдущем абзаце.