- •1 Основные компоненты для работы с графикой
- •2 Свойства класса тCanvas
- •3 Методы и события класса тCanvas
- •4. Разработка простой программы
- •5. Создание «резиновой нити»
- •6. Реализация преобразования координатных систем
- •7. Добавление функции масштабирования изображения
- •8. Дополнительное задание
- •9. Заключение.
- •7 Контрольные вопросы
7. Добавление функции масштабирования изображения
Рассмотрим, как можно изменить этот коэффициент. Самый простой способ - это явное задание масштаба. Многие хорошо вам знакомые прикладные программы предоставляют пользователю возможность задать масштаб изображения в процентах. Однако, для графических систем данный подход не удобен. При увеличении масштаба пользователь не может указать какую именно часть изображения он хочет видеть на экране в увеличенном виде. Система предлагает пользователю тот или иной фрагмент, и для поиска нужной части изображения приходится пользоваться полосами прокрутки.
При другом подходе пользователь непосредственно указывает прямоугольную область изображения, которую он хочет увидеть на экране увеличенной. Фрагменты, попавшие в указанную область, появятся на экране, а не попавшие подвергнутся отсечению. Такими свойствами обладает не что иное, как окно преобразования. Заданный пользователем прямоугольник - это образ будущего окна преобразования. Определяя прямоугольник, пользователь с помощью мыши задает пару точек в экранных координатах. Для того чтобы получить из них координаты окна необходимо применить к данным точкам обратное преобразование. Остается только перечертить изображение на экране с учетом изменившихся характеристик преобразования устройства.
Реализуете такой подход в нашей программе. Для этого вам потребуется новый тип курсора – «резиновый прямоугольник». Принципы его построения аналогичны принципам создания «резиновой нити». Не забудьте учесть ограничение, наложенное на окно - оно должно быть подобно полю вывода. Мы приняли отношение сторон равное единице, что присуще квадрату. В принципе, отношение сторон прямоугольников, определяющих окно и поле вывода, может быть любым – главное чтобы оно было одинаковым. Задается такое ограничение достаточно просто. Первая точка, определяющая прямоугольник, безусловно, принимается, а от второй точки берется одна из координат. Значение второй координаты рассчитывается исходя из требований ограничения.
Кроме того, необходим механизм, отменяющий увеличение. Самый простой способ – запомнить начальное преобразование и при необходимости восстановить его. Для пользователя удобнее использовать пошаговый откат, позволяющий последовательно отменять увеличения в порядке обратном их заданию. Для реализации пошагового отката требуется стек, в котором будут храниться описания преобразований (история). Как мы уже говорили, преобразование устройства полностью описывается характеристиками окна (в силу того, что поле вывода, у нас зафиксировано). Следовательно, каждая ячейка стека должна хранить координаты двух точек, определяющих окно. При каждом увеличении необходимо занести в стек координаты текущего окна. При выходе из увеличения мы просто восстанавливаем из стека предыдущие координаты окна.
В нашей программе появляется несколько функций, и необходимо разобраться, какую из них в данный момент хочет выполнить пользователь. То есть необходимо организовать поддержку диалога с пользователем. Задача сложная и выходящая за рамки нашего курса. Мы просто определим некоторую переменную, которая будет определять состояние системы на текущий момент времени. Разрешим ей принимать два значения – Lines (отрезки) и Zoom (лупа). По умолчанию установим значение Lines.
Теперь модифицируйте код нашей программы.
Обработчик события onMouseDown можно оставить без изменений, нам безразлично, вводит пользователь первую точку окна или отрезка.
В обработчике события onMouseMove требуется учитывать состояние системы. Если система находится в состоянии Lines, то используем курсор – «резиновая нить», в противном случае (состояние Zoom) - «резиновый прямоугольник».
Действия по отпусканию кнопки мыши также зависят от состояния системы. В состоянии Lines необходимо вычертить отрезок. В другом случае набор действий более широк:
занести в стек характеристики текущего окна преобразования;
применить к веденным пользователем точкам прямоугольника обратное преобразование устройства, получив координаты нового окна;
заменить координаты текущего окна новыми значениями;
перевести систему в состояние Lines;
инициировать перерисовывание модели.
Нам потребуется создать две кнопки. Первая – “Увеличить”. При ее нажатии мы переводим систему в состояние “Zoom” (устанавливаем соответствующее значение переменной за него отвечающей за состояние). Вторая кнопка - «Отменить». Ее нажатие приводит к выполнению следующих действий:
извлечению из стека (если он не пуст) сохраненных при последнем увеличении координат окна преобразования;
замены текущих значений окна извлеченными значениями;
перечерчиванию модели.
Состояние системы при этом не изменяется (Lines).
