Разница между InvalidateRect и RedrawWindow
Когда я хочу перерисовать окно, есть ли какая-либо предпочтительная функция для вызова между InvalidateRect и RedrawWindow?
Например, эти два вызова равны: (победа будет HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);
Основной вопрос (ы): Когда я должен использовать тот или иной? Существуют ли какие-либо различия в фоновом режиме? (разные WM_messages/focus/order/priority..)
Причина, по которой я хочу перерисовать окно, заключается в том, что я отправляю ему новое изображение, которое я хочу показать, что означает, что содержимое окна больше не действует.
Ответы
Ответ 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 имеют более низкий приоритет, чем другие сообщения, поэтому перерисовка будет не сразу, если ваше приложение занято обработкой других сообщений.