Подтвердить что ты не робот

Разница между InvalidateRect и RedrawWindow

Когда я хочу перерисовать окно, есть ли какая-либо предпочтительная функция для вызова между InvalidateRect и RedrawWindow?

Например, эти два вызова равны: (победа будет HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

Основной вопрос (ы): Когда я должен использовать тот или иной? Существуют ли какие-либо различия в фоновом режиме? (разные WM_messages/focus/order/priority..)

Причина, по которой я хочу перерисовать окно, заключается в том, что я отправляю ему новое изображение, которое я хочу показать, что означает, что содержимое окна больше не действует.

4b9b3361

Ответ 1

InvalidateRect не сразу перерисовывает окно. Он просто "расписывает" будущую перерисовку для определенной прямоугольной области окна. Используя InvalidateRect, вы можете планировать столько областей, сколько захотите, чтобы они накапливались в некотором внутреннем буфере. Фактическая перерисовка для всех накопленных запланированных областей состоится позже, когда в окне нет ничего другого. (Конечно, если окно не работает в тот момент, когда вы вызываете вызов InvalidateRect, перерисовка будет выполняться немедленно).

Вы также можете принудительно выполнить перерисовку для всех накопленных ранее недействительных областей, вызвав UpdateWindow. Но, опять же, если вы не спешите, явное вызов UpdateWindow не требуется, так как после того, как окно неактивно, оно автоматически выполнит перерисовку для всех недействительных областей.

RedrawWindow, с другой стороны, является функцией с гораздо более широким и гибким набором возможностей. Он может использоваться для выполнения планирования недействительности (т.е. То же самое, что и для InvalidateRect), или его можно использовать для принудительного выполнения непосредственной перерисовки указанной области без какого-либо "планирования". В последнем случае вызов RedrawWindow фактически эквивалентен вызову InvalidateRect, а затем сразу вызывает UpdateWindow.

Ответ 2

RedrawWindow(win, NULL, NULL, RDW_INVALIDATE); и InvalidateRect(win, NULL, NULL); эквивалентны. Обе функции недействительны для окна. WM_PAINT происходит в обычное время (никаких других сообщений в очереди приложений) в обоих случаях.

Если вы хотите, чтобы краска была сделана сразу же, то вызов этого RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW) или InvalidateRect, за которым следует UpdateWindow, сделает это.

RedrawWindow просто дает больше опций с битами RDW_ *. Если все, что вам нужно, - это сделать недействительным окно без непосредственной краски, тогда вызов InvalidateRect кажется более чистым.

Ответ 3

Мне не нравится просто указывать ссылки, но MSDN дает вам всю необходимую информацию, и было бы пустой тратой времени, чтобы перепечатать все это здесь.

RedrawWindow

InvalidateRect

Короче говоря, да, есть различия. Вопрос в том, почему вы хотите перерисовать окно? Это потому, что содержимое больше недействительно? Если это так, используйте InvalidateRect, в противном случае используйте RedrawWindow.

Ответ 4

RedrawWindow немедленно распаковывает окно. InvalidateRect только отмечает окно, которое должно быть перекрашено в следующее сообщение WM_PAINT. Но сообщения WM_PAINT имеют более низкий приоритет, чем другие сообщения, поэтому перерисовка будет не сразу, если ваше приложение занято обработкой других сообщений.