Л а б о р а т о р н а я р а б о т а N 4
Использование графических возможностей системы Delphi
Цель pаботы: научиться составлять программы с использованием графических свойств и методов компонентов в системе Delphi.
Продолжительность работы - 4 ч.
Теоретические сведения
И
Рис.1. Канва формы,
ширина и высота формы Form1.Canvas
П
Form1.ClientWidth
X |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
|
|
|
|
|
|
| |
1 |
|
|
|
|
|
|
|
|
2 |
|
|
|
|
(4,3) |
|
|
|
3 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
Y
Рис.2. Система координат канвы
Канва, будучи свойством Canvasформы, является в то же время объектом типаTCanvas, у которого есть свои свойства и методы, перечисленные в табл. 1 и 2.
Таблица 1
Свойства канвы
-
Свойство
Пояснение
Pixels
Массив цветов пикселей
Pen
Перо для рисования линий
PenPos
Текущая позиция пера
Brush
Кисть для закрашивания замкнутых участков канвы
Font
Шрифт, которым выводится текст
Таблица 2
Методы канвы
-
Метод
Действие
Arc
Рисует пером дугу окружности или эллипса
Chord
Рисует пером замкнутую фигуру, ограниченную дугой окружности или эллипса и хордой, и закрашивает ее кистью
Ellipse
Рисует пером окружность или эллипс и закрашивает кистью
Pie
Рисует пером сектор окружности или эллипса и закрашивает кистью
Polygon
Рисует пером многоугольник и закрашивает кистью
Polyline
Рисует пером кусочно-линейную кривую
Rectangle
Рисует пером прямоугольник и закрашивает его кистью
RoundRect
Рисует пером прямоугольник со скругленными углами и закрашивает его кистью
FillRect
Закрашивает кистью прямоугольную область канвы
FloodFill
Закрашивает кистью замкнутую область канвы, определенную цветом
FrameRect
Рисует кистью на канве прямоугольную рамку, не закрашивая ее внутреннюю часть (толщина рамки - 1 пиксель)
MoveTo
Перемещает перо в заданную позицию, ничего не рисуя
LineTo
Рисует пером на канве прямую линию, начинающуюся с текущей позиции пера и кончающуюся указанной точкой
TextOut
Пишет указанную строку текста на канве, начиная с указанной позиции
TextRect
Пишет указанную строку текста на канве, начиная с указанной позиции и усекая текст, выходящий за пределы указанной прямоугольной области
Информация о цвете пикселей, заполняющих канву, хранится в свойстве Pixels, которое является двумерным массивом. Каждый элемент этого типа соответствует одному пикселю канвы и имеет типTcolor.Значение этого типа обозначает цвет, кодируемый 4-байтовым 16-ичным числом, три младшие пары разрядов которого задают интенсивность синего, зеленого и красного цвета соответственно, например: $00FF0000 - синий, $0000FF00 - зеленый, $000000FF - красный, $00000000 - черный, $00FFFFFF - белый. Для обозначения некоторых цветов предусмотрены стандартные константы, приведенные в табл.3.
Таблица 3
Константы, обозначающие цвета
-
Константа
Цвет
clBlack
Черный
clMaroon
Темно-бордовый
clGreen
Зеленый
clOlive
Оливково-зеленый
clNavy
Темно-синий
clPurple
Пурпурный
clTeal
Морской воды
clGray
Серый
clSilver
Серебряный
clRed
Красный
clLime
Лимонно-зеленый
clBlue
Синий
clYellow
Желтый
clFuchsia
Сиреневый
clAqua
Голубой
clWhite
Белый
Например, оператор Form1.Canvas.Pixels[4,3]:=clRed окрашивает пиксельс координатами (4,3) в красный цвет.
Перо (Pen) имеет такие свойства, какColor - цвет, которым наносится рисунок; Width - ширина рисуемой линии (задается числом пикселей); Style - вид рисуемой линии. Значение свойстваStyleзадается одной из констант, перечисленных в табл.4.
Таблица 4
Вид линий (Style)
-
Обозначение
Пояснение
Шаблон
psSolid
Сплошная линия
psDash
Штриховая линия
psDot
Пунктирная линия
-------------------
psDashDot
Штрих-пунктирная линия
- - -
psDashDotDot
Линия, чередующая штрих и два пунктира
-- -- --
psClear
Отсутствие линии
psInsideFrame
Сплошная линия, но при Width > 1 принимающая цвета, отличные от палитры ОС Windows
Все стили со штрихами и пунктирами доступны только при Width = 1. В противном случае линии этих стилей рисуются как сплошные.
Стиль psInsideFrame - единственный, который допускает произвольные цвета. Цвет линии при остальных стилях округляется до ближайшего из палитры ОС Windows.
Например, чтобы перо могло рисовать синиелинии шириной 5, нужно задать свойствам пера следующие значения, воспользовавшись оператором присоединения:
with Form1.Canvas.Pen do
begin
Color := clBlue;
Style := psSolid;
Width := 5;
end;
Кисть (Brush) среди прочих свойств имеет свойстваColor, определяющее цвет закрашиваемого участка, и Style, задающее шаблон штриховкизакрашиваемого участка. Шаблоны обозначаются константами, перечисленными в табл.5.
Таблица 5
Шаблоны штриховки (Style)
-
Обозначение
Штриховка
bsSolid
Сплошная
bsClear
Отсутствует
bsBDiagonal
Правая диагональная
bsFDiagonal
Левая диагональная
bsCross
Прямая клетка
bsDiagCross
Диагональная клетка
bsHorizontal
Горизонтальная
bsVertical
Вертикальная
Например, чтобы участок закрашивался сплошным зеленым цветом, нужно задать следующие значения свойствкисти:
with Form1.Canvas.Brush do
begin
Color := clGreen;
Style := bsSolid;
end;
Шрифт (Font), которым выводится текст, характеризуется следующими свойствами: Color - цвет текста; Name - имя шрифта; Size - размер шрифта; Style- стиль шрифта (fsBold - полужирный; fsItalic - курсив; fsUnderline - подчеркивание). Например, чтобы текст выводился полужирным курсивом и был голубого цвета, нужно задать следующие значения свойствшрифта:
with form1.Canvas.Font do
begin
Style := [fsBold,fsItalic];
Color := clAqua;
Size := 10;
Name := 'Times New Roman';
end;
Методы канвы, перечисленные в табл.2, вычерчивают на канве линии и фигуры, а также позволяют выводить текст с учетом заданного шрифта. Представленное на рис.3 изображение получено с помощью следующих операторов:
with Form1.Canvas do
begin
Font.Style:=[fsBold];
Arc(10,10,90,90,90,50,10,50);
TextOut(40,60,'Arc');
Chord(110,10,190,90,190,50,110,50);
TextOut(135,60,'Chord');
Ellipse(210,10,290,50);
TextOut(230,60,'Ellipse');
Pie(310,10,390,90,390,30,310,30);
TextOut(340,60,'Pie');
PolyGon([Point(30,150),Point(40,130),Point(50,140),
Point(60,130),Point(70,150)]);
TextOut(30,170,'PolyGon');
PolyLine([Point(130,150),Point(140,130),Point(150,140),
Point(160,130),Point(170,150)]);
TextOut(130,170,'PolyLine');
Rectangle(230,120,280,160);
TextOut(230,170,'Rectangle');
RoundRect(330,120,380,160,20,20);
TextOut(325,170,'RoundRect');
end;