Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графика методичка.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
106 Кб
Скачать
☆

3 Методы и события класса тCanvas

Объекты класса TCanvas имеют много методов, которые удовлетворяют потребности, возникающие при создании большинства прикладных программ. Такие методы построения фигур, как ArcEllipse, FloodFill, Polygon, Rectangle, RoundRect и др., непосредственно обращаются к функциям GDI, которые имеют те же самые имена. Их перечень можно получить в справке Delphi.

He забывайте перед каждым использованием объекта Canvas присваивать значения его свойствам в обработчике события OnPaint. Например, чтобы нарисовать синюю линию, подсвойству Pen.Color свойства Canvas присвойте значение clBlue, а затем вызовите методы MoveTo и LineTo. Свойства Canvas нельзя предварительно сконфигурировать в обработчике события формы OnCreate, поскольку событие OnPaint получает дескриптор контекста устройства от Windows, а сам контекст устройства обеспечивается вашей программой через Canvas. Таким образом, Canvas в OnPaint не содержит ни одного значения свойства, которое вы присваиваете вне обработчика этого события. Ниже приведен список методов Canvas, назначение которых не столь очевидно.

CopyRect. Копирует все или часть содержимого одного объекта Canvas в другой. Установите свойство CopyMode, чтобы задать способ объединения пикселей. Применяемые значения свойства CopyMode вы можете узнать из интерактивной справки Delphi.

Draw. Рисует объект класса TGraphic, который является прямым предком классов TIcon, TBitmap и TMetafile. В метод Draw вы можете передавать любую пиктограмму, растровое изображение или метафайл.

DrawFocusRect. Рисует прямоугольник, используя логическую операцию исключающего ИЛИ (XOR). При повторном вызове этого метода с идентичными аргументами удаляется нарисованный прямоугольник и восстанавливается предыдущее изображение.

FrameRect. Рисует незаполненный прямоугольник, используя текущее значение свойства Pen, но игнорируя Brush. Если вы, не используя свойства Brush, хотите получить простой контур, вместо Rectangle примените метод FrameRect.

StretchDraw. Работает аналогично методу Draw, но растягивает или уменьшает пиктограмму, растровое изображение или метафайл, чтобы они поместились в заданном прямоугольнике.

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

  • OnChange. Вызывается после изменения значения свойства Canvas.

  • OnChanging. Вызывается непосредственно перед изменением свойства Canvas.

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

4. Разработка простой программы

Решим простую задачу – вычерчивание на экране отрезков. Для этого разместите на форме экземпляр объекта TРaintBox, обладающий доступным свойством Сanvas. В обработчик события onMouseDown данного объекта поместите код, запоминающий координаты курсора в момент нажатия кнопки мыши. Эти координаты будут определять начальную точку отрезка. В обработчик события onMouseUp поместите код, производящий построение отрезка, соединяющего запомненную точку с точкой, в которой произошло отпускание кнопки мыши. Для этого можно использовать методы MoveTo и LineTo объекта Сanvas. Поставленная задача решена, однако наша программа имеет ряд существенных недостатков. Мы будем рассматривать и устранять их поочередно.

При сворачивании окна или изменении его размеров нарисованные отрезки будут исчезать. Причина ясна. При наступлении этих событий (и ряда других) происходит перерисовка окна, в процессе которой все его содержимое стирается. Преодолеть данное затруднение можно, заменив визуальный компонент TPaintBox на компонент TImage. Этот компонент хранит в себе образ создаваемого растрового изображения и, при необходимости, обеспечивает его перерисовку. Однако такой подход не очень удачен, так как мы не сможем редактировать созданное изображение (сможем, но только попиксельно). Более удачным решением будет хранение координат конечных точек всех созданных отрезков и перерисовывание созданного изображения или его фрагментов при необходимости. Структуру, хранящую координаты точек, в грубом приближении, можно рассматривать как модель.

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

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

Напишите процедуру, рисующую отрезки по координатам точек, хранящимся в массиве. Разместите вызов этой процедуры в обработчике события onPaint компонента TPaintBox. Таким образом мы обеспечиваем восстановление изображения.

Не размещайте вызов в обработчике события onPaint формы. Для формы это событие порождается при изменении любого объекта формы. В результате возникает избыточное перечерчивание.