Разница между InvalidateRect и RedrawWindow - PullRequest
38 голосов
/ 24 февраля 2010

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

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

Основной вопрос (ы) : Когда мне следует использовать один или другой? Есть ли какие-либо различия, которые происходят на заднем плане? (разные WM_messages / focus / order / приоритеты ..)

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

Ответы [ 4 ]

52 голосов
/ 24 февраля 2010

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

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

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

19 голосов
/ 27 ноября 2012

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 кажется более чистым.

1 голос
/ 24 февраля 2010

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

1 голос
/ 24 февраля 2010

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

RedrawWindow

InvalidateRect

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

...