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

О Если изображение сформировано в результате последовательности действий пользователя, ее нужно запоминать, а для восстановления изображения воспроизводить всю последовательность заново.

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

Рисование без восстановления

Рис. 3.1. Рисование без восстановления Вывод динамических изображений Вывод динамических изображений В случае формирования динамических изображений для создания эффекта непрерывного движения картинка в окне стирается и рисуется заново с высокой частотой (20 и более раз в секунду). При этом нет смысла использовать сообщения WM_PAINT о появлении дефектных областей, так как приложение и без того достаточно часто обновляет все изображение.

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

Листинг 3.6

void RotateLine(HDC hdc. int Erase) {static double Alfa - 0; double dAlfa - 5.0/360.0*6.283; RECT r;

⇐ Предыдущая| |Следующая ⇒