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


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

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

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

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

Назад в оглавление
На главную страницу

Hosted by uCoz