Главная » Статьи » Основные статьи сайта |
Класс TCanvas Этот класс — сердцевина графической подсистемы Delphi. Он
объединяет в себе и "холст" (контекст конкретного устройства GDI), и
"рабочие инструменты" (перо, кисть, шрифт), и даже
"подмастерьев" (набор функций по рисованию типовых геометрических
фигур). Будем называть его канвой. Канва не является компонентом, но она присутствует в
качестве свойства во многих других компонентах, которые должны уметь нарисовать
себя и отобразить какую-либо информацию. Читатели, знакомые с графикой Windows, узнают в TCanvas объектно-ориентированную
надстройку над контекстом устройства Windows (Device Context, DC). Дескриптор
устройства, над которым "построена" канва, может быть востребован для
различных низкоуровневых операций. Он задается свойством: property Handle: HDC; Для рисования канва включает в себя шрифт, перо и кисть: property
Font: TFont; property Pen: TPen; property Brush: TBrush; Кроме того, можно рисовать и поточечно, получив доступ к
каждому пикселу. Значение свойства: property
Pixels[X, Y: Integer]: TColor; соответствует цвету точки с координатами X, Y. Необходимость отрисовывать каждую точку возникает нередко.
Однако, если нужно модифицировать все или хотя бы многие точки изображения,
свойство Pixels надо сразу отбросить — настолько оно неэффективно. Гораздо
быстрее редактировать изображение при помощи свойства scanLine объекта TBitmap;
об этом рассказано ниже. Канва содержит методы-надстройки над всеми основными функциями рисования GDI Windows и свойства, которые приведены в табл. 10.4 и 10.5. При их рассмотрении имейте в виду, что все геометрические фигуры рисуются текущим пером. Те из них, которые можно закрашивать, закрашиваются с помощью текущей кисти. Кисть и перо при этом имеют текущий цвет. Таблица 10.4. Методы класса TCanvas
Таблица 10.5. Свойства класса TCanvas
Метод procedure Refresh; сбрасывает текущие шрифт, перо и кисть, заменяя их на
стандартные, заимствованные из установок Windows (BLACK PEN, HOLLOW_BRUSH,
SYSTEM_FONT). Предусмотрено два события для пользовательской реакции на
изменение канвы: property OnChange:
TNotifyEvent; property OnChanging: TNotifyEvent; Эти события возникают при изменении свойств и вызове методов
TCanvas, меняющих вид канвы (т. е. при любом рисовании. В методе MoveTo,
например, они не возникают). Отличие их в том, что событие OnChanging
вызывается до начала изменений, а событие OnChange — после их завершения. Идентификатор (код) растровой операции при копировании
прямоугольных блоков содержится в свойстве property
CopyMode: TCopyMode; TCopyMode = Longint; и определяет правило сочетания пикселов, копируемых на
канву, с ее текущим содержимым. При этом можно создавать разные изобразительные
эффекты. В Delphi определены следующие константы кодов: cmBiackness,
craDstlnvert, cmMergeCopy, cmMergePaint, cmNotSrcCopy, cmNotSrcErase,
cmPatCopy, cmPatlnvert, cmPatPaint, cmSrcAnd, cmSrcCopy, cmSrcErase,
cmSrdnvert, cmSrcPaint, cmWhiteness. Все они стандартно определены в Windows, и подробное их
описание можно найти в документации по GDI. Значением свойства CopyMode по умолчанию
является cmSrcCopy — копирование пикселов источника поверх существующих. Из возможностей, появившихся в классе TCanvas, следует
отметить поддержку рисования кривых (полиномов) Безье. Эта возможность впервые появилась в API Windows NT. Для построения одной кривой
нужны минимум четыре точки — начальная, конечная и две опорные. По ним будет
построена кривая второго порядка. Если задан массив точек, они используются для
построения последовательных кривых, причем последняя точка одной кривой является
первой для следующей кривой. Хорошей иллюстрацией использования объекта TCanvas может служить пример GraphEx, поставляемый вместе с Delphi (папка \Demos\Doc\GraphEx). Есть только одно "но" — он приводится в неизменном виде, начиная с версии Delphi 1.0. Поэтому сделаем часть работы за программистов Borland. В нашем примере модернизированы Панели инструментов — они выполнены на компонентах TToolBar и TControlBar; добавлена поддержка файлов JPEG; и, наконец, добавлена возможность рисования кривых Безье. Обновленный внешний вид главной формы примера GraphEx показан на рис. 10.1. Рис. 10.1. Так теперь выглядит главная форма примера GraphEx Где же найти ту канву, на которой предстоит рисовать?
Во-первых, ею снабжены все потомки классов TGraphicControl и TCustomControl, т.
е. почти все визуальные компоненты из Палитры компонентов; в том числе и форма.
Во-вторых, канву имеет растровая картинка (класс TBitmap); вы можете писать и
рисовать не на пустом месте, а на готовом изображении (об этом см. ниже в разд.
"Класс TBitmap" данной главы). Но иногда нужно рисовать и прямо на
экране. В этом случае придется прибегнуть к использованию функций API. Функция
Getoc возвращает контекст устройства заданного окна, если ей передается
параметр 0 — то всего экрана: ScreenCanvas
:= TCanvas.Create; ScreenCanvas.Handle
:=GetDC{0); // Рисование на
ScreenCanvas ReleaseDC(0,
ScreenCanvas.Handle); ScreenCanvas.Free; Пример необходимости рисования на экране — программы
сохранения экрана (Screen savers). Когда и где следует рисовать? Этот вопрос далеко не
риторический, как может показаться с первого взгляда. Помимо графических примитивов, таких как линии и фигуры, на канве можно разместить готовые изображения. Для их описания создан класс TGraphic. Класс TGraphic Канва, перо, кисть и шрифт нужны, чтобы нарисовать свою
картинку. Чтобы загрузить готовую, необходимы объекты, "понимающие"
графические форматы Windows. Абстрактный класс TGraphic является родительским для трех
видов изображений, общепринятых в графике Windows — значка (компонент Ticon),
метафайла (компонент TMetafile) И растровой картинки (компонент TBitmap).
Четвертым потомком TGraphic является TuPEGimage — сжатая растровая картинка в
формате JPEG. Работая над приложением в Delphi, вы никогда не будете
создавать объекты класса TGraphic, но переменной этого типа вы можете
присваивать указатель на любой из перечисленных классов-потомков. Метод: procedure
Assign(Source: TPersistenti; переопределяет одноименный метод предка, допуская
полиморфное присваивание графических объектов. Загрузку и выгрузку графики в поток осуществляют методы: procedure
LoadFromStream(Stream: TStream); procedure
SaveToStream(Stream: TStream); а загрузку и выгрузку в файл — методы: procedure
LoadFromFile(const Filename: string); procedure SaveToFile(const Filename:
string); Эти методы создают соответствующий файловый поток и затем
вызывают методы LoadFromStream/SaveToStream. Два метода осуществляют взаимодействие с буфером обмена
Windows: procedure
LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette:
HPALETTE); procedure
SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE); Здесь AFormat — используемый графический формат; AData и
APalette — данные и палитра (если она требуется). Потомок должен иметь свой
формат представления в буфере обмена и уметь обрабатывать данные,
представленные в нем. Загрузка больших графических файлов может продолжаться очень
долго. Чтобы скрасить пользователю ожидание, программист может обработать
событие OnProgress! type TProgressStage
= (psStarting, psRunning, psEnding); TProgressEvent
= procedure (Sender: TObject; Stage: TProgressStage; PercentDone:
Byte; RedrawNow: Boolean; const R: TRect;
const Msg: string) of object; property OnProgress: TProgressEvent; Оно вызывается графическими объектами во время длительных
операций. Параметр stage означает стадию процесса
(начало/протекание/завершение), a PercentDone — процент сделанной работы. Сразу
оговоримся, что не все из тех объектов, которые будут нами описаны, вызывают
обработчик события OnProgress. Свойство: property Empty: Boolean; устанавливается в значение True, если графический объект пуст
(в него не загружены данные). Высота и ширина графического объекта задаются свойствами: property
Height: Integer; property Width: Integer; Для каждого дочернего типа эти параметры вычисляются своим
способом. Наконец, свойство: property Modified: Boolean; показывает, модифицировался ли данный графический объект.
Это свойство устанавливается в значение True внутри обработчика события
OnChange. Многие графические объекты при отрисовке должны быть
прозрачными. Одни из них прозрачны всегда (значок, метафайл), другие — в
зависимости от значения свойства property Transparent: Boolean; Нравится | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Просмотров: 9169
| Теги: |
Другие статьи
|
|
|
|
Всего комментариев: 0 | |