|
|
Сервер
поддерживается
кафедрой информатики и
вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail : kadan@grsu.grodno.by
|
Класс TCanvas
TCanvas =
class(TPersistent)
Этот класс ?
сердцевина графической подсистемы
Delphi. Он объединяет в себе и
"холст" (контекст конкретного
устройства GDI), и "рабочие
инструменты" (перо, кисть, шрифт)
и даже "подмастерьев" (набор
функций по рисованию типовых
геометрических фигур).
В дальнейшем для
обозначения этого класса мы будем
пользоваться термином "канва".
Сознавая неоднозначность такого
перевода, авторы тем не менее
считают, что у него наилучшие шансы
прижиться.
Канва не является
компонентом, но она входит в
качестве свойства во многие другие
компоненты, которые должны уметь
нарисовать себя и отобразить
какую-либо информацию.
Дескриптор
контекста устройства, над которым
"построена" канва, может быть
востребован для различных
низкоуровневых операций. Он
задается свойством:
property Handle:
HDC;
Для рисования
канва включает в себя шрифт, перо и
кисть:
(Pb) property Font: TFont;
(Pb) property Pen: TPen;
(Pb) property Brush: TBrush;
Кроме того, можно
рисовать и поточечно, получив
доступ к каждому пикселу. Значение
свойства
property Pixels[X,
Y: Integer]: TColor;
соответствует
цвету точки с координатами (X,Y).
Канва содержит
методы-надстройки над всеми
основными функциями рисования GDI
Windows и свойства, которые приведены
ниже в таблице. При их рассмотрении
имейте в виду, что все
геометрические фигуры рисуются
текущим пером. Те из них, которые
можно закрашивать, закрашиваются с
помощью текущей кисти. Кисть и перо
при этом имеют текущий цвет.
Procedure Arc
(XI, Y1, Х2, Y2, Х3, Y3, Х4, Y4: Integer); |
Метод рисует
сегмент эллипса. Эллипс
определяется описывающим
прямоугольником (X1,Y1) ? (X2,Y2);
его размеры должны лежать в
диапазоне от 2 до 32767 точек.
Начальная точка сегмента лежит
на пересечении эллипса и луча,
проведенного из его центра
через точку (X3,Y3). Конечная
точка сегмента лежит на
пересечении эллипса и луча,
проведенного из его центра
через точку (X4,Y4). Сегмент
рисуется против часовой
стрелки. |
Procedure Chord(XI,
Y1, X2, Y2, Х3, Y3, X4, Y4: Integers- |
Рисует хорду и
заливает отсекаемую ею часть
эллипса. Эллипс, начальная и
конечная точки определяются,
как в методе Arc. |
Procedure Ellipse (X1,
Y1, X2, Y2: Integer) ; |
Рисует и
закрашивает эллипс, вписанный
в прямоугольник (X1,Y1) ? (X2,Y2). |
procedure LineTo(X,
Y: Integer); |
Проводит линию
текущим пером из текущей точки
в (X,Y). |
Procedure MoveTo(X,
Y: Integer); |
Перемещает
текущее положение пера
(свойство PenPos) в точку (X,Y). |
procedure BrushCopy(const
Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color:
TColor); |
Производит
специальное копирование.
Прямоугольник Source из битовой
карты Bitmap копируется в
прямоугольник Dest на канве; при
этом цвет Color заменяется на
цвет текущей кисти (Brush.Color). С
помощью этого метода можно
нарисовать "прозрачную"
картинку. Для этого нужно
выбрать соответствующий фону
цвет кисти и затем заменить на
него фоновый или наиболее
часто встречающийся цвет
битовой карты (см.
Bitmap.TransparentColor). |
procedure CopyRect(const
Dest: TRect; Canvas: TCanvas; const Source: TRect); |
Производит
копирование прямоугольника
Source из канвы Canvas в
прямоугольник Dest в области
самого объекта. |
procedure FillRect(const
Rect: TRect) ; |
Производит
заливку прямоугольника
(текущей кистью). |
procedure FrameRect(const
Rect: Trect); |
Производит
оконтуривание прямоугольника
цветом текущей кисти (без
заполнения). |
procedure Draw(X,
Y: Integer; Graphic: TGraphic); |
Осуществляет
рисование графического
объекта Graphic (точнее, вызов
метода его рисования) в области
с верхним левым углом (X,Y). |
procedure StretchDraw(const
Rect: TRect; Graphic: TGraphic); |
Осуществляет
рисование объекта Graphic в
заданном прямоугольнике Rect.
Если размеры их не совпадают,
Graphic м асштабируется. |
Procedure DrawFocusRect(const
Rect: TRect) ; |
Производит
отрисовку прямоугольной рамки
из точек (как на элементе,
имеющем фокус ввода). Поскольку
метод использует логическую
операцию XOR (исключающее ИЛИ),
повторный вызов для того же
прямоугольника приводит
изображение к начальному виду. |
Procedure FloodFill
(X, Y: Integer; Color: TColor; FillStyle: TFillStyle)
;
TfillStyle = (fsSurface,
fsBorder); |
Производит
заливку области текущей
кистью. Процесс начинается с
точки (X,Y). Если режим FillStyle
равен fsSurface, то он продолжается
до тех пор, пока есть соседние
точки с цветом Color. В режиме
fsBorder закрашивание, наоборот,
прекращается при выходе на
границу с цветом Color. |
Procedure Pie(X1,
Y1, X2, Y2, X3, Y3, X4, Y4: Integer); |
Рисует сектор
эллипса, описываемого
прямоугольником (X1,Y1) ? (X2,Y2).
Стороны сектора лежат на лучах,
проходящих из центра эллипса
через точки (X3,Y3) и (X4,Y4). |
Procedure Polygon(const
Points: array of TPoint) ; |
Строит
многоугольник, используя
массив координат точек Points. При
этом последняя точка
соединяется с первой и
внутренняя область
закрашивается. |
procedure Polyline(const
Points: array of Tpoint) ; |
Строит ломаную
линию, используя массив
координат точек Points. |
procedure Rectangle(X1,
Y1, X2, Y2 : Integer) ; |
Рисует
прямоугольник с верхним левым
углом в (XI ,Y1) и нижним правым в
(X2,Y2). |
procedure RoundRect(X1,
Y1, X2, Y2, X3, Y3: Integer); |
Рисует
прямоугольник с закругленными
углами. Координаты вершин ? те
же, что и в методе Rectangle.
Закругления рисуются как
сегменты эллипса с размерами
осей по горизонтали и
вертикали ХЗ и Y3. |
function TextHeight(const
Text: string): Integer; |
Возвращает высоту
строки Text в пикселах. |
function TextWidth(const
Text: string): Integer; |
Возвращает ширину
строки Text в пикселах. |
procedure TextOut(X,
Y: Integer; const Text: string); |
Производит вывод
строки Text. Левый верхний угол
помещается в точку канвы (X,Y). |
procedure TextRect(Rect:
TRect; X, Y: Integer; const Text: string); |
Производит вывод
текста с отсечением. Как и в
TextOut, строка Text выводится с
позиции (X,Y); при этом часть
текста, лежащая вне пределов
прямоугольника Rect, отсекается
и не будет видна. |
(Ro) property ClipRect: TRect; |
Определяет
область отсечения канвы. То,
что при рисовании попадает за
пределы этого прямоугольника,
не будет изображено. Свойство
доступно только для чтения ?
его значение
переустанавливается системой
в контексте устройства канвы. |
property PenPos:
TPoint; |
Содержит текущую
позицию пера канвы (изменяется
посредством метода MoveTo). |
Метод
procedure Refresh;
сбрасывает
текущие шрифт, перо и кисть, заменяя
их на стандартные, заимствованные
из Windows (BLACK_PEN, HOLLOWJBRUSH, SYSTEMJFONT).
Предусмотрено два
события для пользовательской
реакции на изменение канвы:
property OnChange:
TNotifyEvent;
property OnChanging:
TNotifyEvent;
Эти события
возникают при изменениях свойств и
вызовах методов TCanvas, меняющих вид
канвы (то есть при любом рисовании.
В MoveTo, например, они не возникают).
Отличие их в том, что OnChanging
вызывается до начала изменений, a
OnChange ? после их завершения.
Идентификатор
(код) растровой операции при
копировании прямоугольных блоков
содержится в свойстве
(Pb) property CopyMode: TCopyMode;
TCopyMode = Longint;
и определяет
правило сочетания пикселов,
копируемых на канву, с ее текущим
содержимым. При этом можно
создавать разные изобразительные
эффекты. В Delphi определены следующие
константы кодов:
cmBlackness, |
cmDstInvert, |
cmMergeCopy, |
cmMergePaint |
CmNotSrcCopy, |
cmNotSrcErase, |
cmPatCopy, |
cmPatInvert |
CmPatPaint, |
cmSrcAnd, |
cmSrcCopy, |
cmSrcErase |
CmSrcInvert, |
cmSrcPaint, |
cmWhiteness. |
|
Все они
стандартно определены в Windows, и
подробное их описание можно найти в
документации по GDI. Значением CopyMode
по умолчанию является cmSrcCopy ?
копирование пикселов источника
поверх существующих.
Использование
графики иллюстрируют несколько
примеров, имеющихся на дискете,
прилагаемой к книге. Обратите
внимание на пример MOVLINES _ в нем
показано, как создавать и
использовать канву для всего
экрана. Помимо графических
примитивов, таких как линии и
фигуры, на канве можно разместить
готовые изображения. Для их
описания создан класс TGraphic.
Для
комментария : kadan@grsu.grodno.by
|
|