Шаг 35 - Выведение внеэкранных образов.

Есть две канвы. Надо с одной канвы на другую перебросить изображение. Что для этого надо? Подходящий метод!

На самом деле копирование канвы гораздо более эффективная операция, чем динамическое построение графики. Если кто обращал внимание, при выведении сложных объектов экран мерцает. Казалось бы, подумаешь - пусть пользователь глаза себе порет ;). Но все же лучше такого не делать. Поэтому общая методика 2d графики приложений такова - строится внеэкранный образ на какой-нибудь канве (невидимой), а затем перебрасывается на канву формы или PaintBox'а.

Кстати о PaintBox'е. Вообще-то считается, что лучше рисовать на PaintBox'е. В Хелпе на это дается ряд причин. Этот компонент еще будет рассмотрен - он с палитры System.

Если кто обращал внимание, при минимизации формы, или закрытия ее окна другим приложением, то, что нарсовано на канве стирается. Скажете вы - а как же сделать, чтобы не стиралось. Дело в том, что у видимых компонентов есть такое событие - OnPaint, которое соответствует редмондовскому WM_PAINT. Туда-то и надо писть обработчик выведения рисунка на канву. Тогда он каждый раз будет обновляться.

Ушел я от темы. Для копирования внеэкранных образов существуют методы.

Draw

Самый простой вариант. На заданных координатах X,Y выводится объект типа TGraphic. TGraphic - абстрактный (со всеми виртуальными методами) класс который не может быть прямо использован в программе. От него только наследуют. А именно наследуют - TBitmap, TIcon, TMetaFile и прочее. Это всем знакомые картинки, иконки и метафайлы. То есть - .bmp, .ico, .wmf, .emf. Еще есть такой класс, как TJPEGImage, позволяющий отображать сжатые в JPEG изображения, и уж совсем замечательный класс TOleGraphic, позволяющий воспроизводить OLE-изображения. Правда, прямо его использовать нельзя, можно только наследовать.

StretchDraw

То же самое, что и предыдущее, только графический объект автоматически масштабируется по параметру TRect. Учтите, что объекты типа TIcon не масштабируются, так что, скорее всего, вылетит ошибка, если Вы попробуете это сотворить. Как пример:

Canvas->StretchDraw(TRect(0,0,40,40),MyGraphic);

Это стандартный вариант обращения к функции.

CopyRect

Копирует участок другой канвы на данную канву. Область-получатель - первый параметр, другая канва - второй, а область, из которой копируется участок - третий.

CopyMode

Это собственно - способ копирования, напоминает свойство Mode пера. Правда, значения у него совсем другие. Я не буду на этом свойстве останавливаться, а то слишком много времени уйдет. Хочу только сказать, что оно относится ко всем вышеперечисленным функциям.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 26.11.2001