Различие между InvalidateRect и RedrawWindow

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

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

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

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

39
задан Default 24 February 2010 в 13:15
поделиться

3 ответа

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

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

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

55
ответ дан 27 November 2019 в 02:31
поделиться

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

RedrawWindow

InvalidateRect

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

1
ответ дан 27 November 2019 в 02:31
поделиться

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

1
ответ дан 27 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: