Синхронное и асинхронное рисование

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

В некоторых случаях приложению необходимо рисовать синхронно, то есть рисовать в окне сразу после того, как часть окна становится недействительной. Обычное приложение рисует окно main сразу после создания окна, чтобы сообщить пользователю о том, что приложение успешно запущено. Система рисует некоторые окна управления синхронно, например кнопки, так как такие окна служат фокусом для ввода данных пользователем. Хотя любое окно с простой процедурой рисования может быть нарисовано синхронно, все такие операции рисования должны выполняться быстро и не должны мешать приложению реагировать на входные данные пользователя.

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

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