Глава 10
Графические возможности Delphi
Например, инструкция Form1.Canvas.Rectangle (10,10,100,100) вычерчивает в окне программы прямоугольник.
Холст
canvas — это объект типа TCanvas
.
Рис. 10.1. Координаты точек холста
Height и width ClientHeight и Clientwidth.
Карандаш и кисть
Реn (карандаш) и Brush (кисть), которые представляют собой объекты типа TPеп и TBrush, соответственно.
Карандаш
Таблица 10.1. Свойства объекта треп (карандаш)
Свойство | Определяет | ||
Color | Цвет линии | ||
Width | Толщину линии | ||
Style | Вид линии | ||
Mode | Режим отображения | ||
Таблица 10.2. Значение свойства Color определяет цвет линии
Константа | Цвет | Константа | Цвет | ||
clBlack | Черный | clSilver | Серебристый | ||
clMaroon | Каштановый | clRed | Красный | ||
clGreen | Зеленый | clLime | Салатный | ||
clOlive | Оливковый | clBlue | Синий | ||
clNavy | Темно-синий | clFuchsia | Ярко-розовый | ||
clPurple | Розовый | clAqua | Бирюзовый | ||
clTeal | Зелено-голубой | clWhite | Белый | ||
clGray | Серый | ||||
Таблица 10.3. Значение свойства Реn. Style определяет вид линии
Константа | Вид линии | ||
psSolid | Сплошная линия | ||
psDash | Пунктирная линия, длинные штрихи | ||
psDot | Пунктирная линия, короткие штрихи | ||
psDashDot | Пунктирная линия, чередование длинного и короткого штрихов | ||
psDashDotDot | Пунктирная линия, чередование одного длинного и двух коротких штрихов | ||
psClear | Линия не отображается (используется, если не надо изображать границу области, например, прямоугольника) | ||
Таблица 10.4. Значение свойства Реп. Mode влияет на цвет линии
Константа | Цвет линии | ||
pmBlack | Черный, не зависит от значения свойства Pen. Color | ||
pmWhite | Белый, не зависит от значения свойства Pen. Color | ||
pmCopy | Цвет линии определяется значением свойства Pen . Color | ||
pmNotCopy | Цвет линии является инверсным по отношению к значению свойства Pen. Color | ||
pmNot | Цвет точки линии определяется как инверсный по отношению к цвету точки холста, в которую выводится точка линии | ||
Кисть
(canvas.Brush)
Таблица 10.5. Свойства объекта TBrush (кисть)
Свойство | Определяет | ||
Color Style | Цвет закрашивания замкнутой области Стиль (тип) заполнения области | ||
Таблица 10.6. Значения свойства Brush. style определяют тип закрашивания
Константа | Тип заполнения (заливки) области | ||
bsSolid | Сплошная заливка | ||
bsClear | Область не закрашивается | ||
bsHorizontal | Горизонтальная штриховка | ||
bsVertical | Вертикальная штриховка | ||
bsFDiagonal | Диагональная штриховка с наклоном линий вперед | ||
bsBDiagonal | Диагональная штриховка с наклоном линий назад | ||
bsCross | Горизонтально-вертикальная штриховка, в клетку | ||
bsDiagCross | Диагональная штриховка, в клетку | ||
Рис. 10.2. Окно программы Стили заполнения областей
Листинг 10.1. Стили заполнения областей
unitbrustyle_;
Interface
usesWindows, Messages, SysUtils, Classes,Graphics, Controls,
Forms, Dialogs, ExtCtrls;
Type
TForm1 = class(TForm)
procedureFormPaint(Sender: TObject);
private{ Private declarations}
public{ Public declarations )
end;
varForm1: TForm1;
Implementation
{$R *.DFM}
// перерисовка формы
procedureTForm1.FormPaint(Sender: TObject);
Const
bsName: array[1..8]of string =('bsSolid','bsClear',
'bsHorizontal','bsVertical','bsFDiagonal',
'bsBDiagonal','bsCross','bsDiagCross');
Var
x,y: integer; // координаты левого верхнего угла прямоугольника
w,h: integer; // ширина и высота прямоугольника
bs: TBrushStyle;// стиль заполнения области
k: integer; // номер стиля заполнения
i,j: integer;
Begin
w:=40; h:=40; // размер области(прямоугольника)
у:=20;
for i:=1to2do
Begin
х:=10;
forj:=1 to4 do
Begin
k:=j+(i-1)*4; // номер стиля заполнения
casek of
1: bs = bsSolid;
2: bs = bsClear;
3: bs = bsHorizontal;
4: bs = bsVertical;
5: bs = bsFDiagonal;
6: bs = bsBDiagonal;
7: bs = bsCross;
8: bs = bsDiagCross; end;
// вывод прямоугольника
Canvas.Brush.Color := clGreen;
// цвет закрашивания — зеленый
Canvas.Brush.Style := bs;
// стиль закрашивания
Canvas.Rectangle(x, y, x+w, y-t-h);
// вывод названия стиля
Canvas.Brush.Style := bsClear;
Canvas.TextOut(x, y-15, bsName[k]);
// вывод названия стиля
x := x+w+30;
end;
у:= y+h+30;
End;end;end.
Вывод текста
Объект.Canvas.TextOut(x, у, Текст)
где:
- объект — имя объекта, на поверхность которого выводится текст;
- х, у — координаты точки графической поверхности, от которой выполняется вывод текста (рис. 10.3);
- Текст — переменная или константа символьного типа, значение которой определяет выводимый методом текст.
Рис. 10.3. Координаты области вывода текста
Таблица 10.7. Свойства объекта TFont
Свойство | Определяет | ||
Name Size Style | Используемый шрифт. В качестве значения следует использовать название шрифта, например Arial Размер шрифта в пунктах (points). Пункт— это единица измерения размера шрифта, используемая в полиграфии. Один пункт равен 1/72 дюйма Стиль начертания символов. Может быть: нормальным, полужирным, курсивным, подчеркнутым, перечеркнутым. Стиль задается при помощи следующих констант: fsBold (полужирный), fsItalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый). | ||
style Color | Свойство style является множеством, что позволяет комбинировать необходимые стили. Например, инструкция программы, устанавливающая стиль "полужирный курсив", выглядит так: Объект. Canvas . Font : = [fsBold, fsItalic] Цвет символов. В качестве значения можно использовать константу типа Tcolor | ||
Внимание!
Область вывода текста закрашивается текущим цветом кисти. Поэтому перед выводом текста свойству Brush.Color нужно присвоить значение bsClear или задать цвет кисти, совпадающий с цветом поверхности, на которую выводится текст.
Следующий фрагмент программы демонстрирует использование функции TextOut для вывода текста на поверхность формы:
withForm1.Canvas do begin
// установить характеристики шрифта
Font.Name := 'Tahoma';
Font.Size := 20;
Font.Style := [fsItalic, fsBold] ;
Brush.Style := bsClear; // область вывода текста не закраш.
TextOut(0, 10, 'Borland Delphi 7');
end;
После вывода текста методом Textout указатель вывода (карандаш) перемещается в правый верхний угол области вывода текста.
Следующий фрагмент программы демонстрирует возможность вывода строки текста при помощи двух инструкций TextOut.
withForm1.Canvas do begin
TextOut(0, 10, 'Borland ') ;
TextOut(PenPos.X, PenPos.Y, 'Delphi 7');
end;
Линия
Компонент.Canvas.LineTo(x,у)
MoveTo(x,y), указав в качестве параметров координаты нового положения карандаша.
Рис. 10.4. Форма приложения Координатная сетка
Interface
usesWindows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TForm1 = class(TForm)
procedureFormPaint(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
varForm1: TForm1;
Implementation
{$R *.DFM}
procedureTForm1.FormPaint(Sender: TObject);
Var
x0,y0:integer; // координаты начала координатных осей
dx,dy:integer; // шаг координатной сетки (в пикселах)
h,w:integer; //высота и ширина области вывода координатной сетки
х,у:integer;
lx,ly:real; // метки (оцифровка) линий сетки по X и Y
dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Y
cross:integer; // счетчик неоцифрованных линий сетки
dcross:integer; // количество неоцифрованных линий между //оцифрованными
Begin
х0:=30; у0:=220; // оси начинаются в точке (40,250)
dx:=40; dy:=40; // шар координатной сетки 40 пикселов
dcross:=1; // помечать линии сетки X: 1 — каждую;
// 2 — через одну; 3 — через две;
dlx:=0.5; // шаг меток оси X
dly:=1.0; // шаг меток оси Y, метками будут: 1, 2, 3 и т. д.
h:=200; w:=300;
withform1.Canvas do begin
cross:=dcross;
MoveTo(x0,v0); LineTo(x0,y0-h); // ось X
MoveTo(x0,y0); LineTo(x0+w, y0); // ось Y
// засечки, сетка и оцифровка по оси X
x:=x0+dx;
lx:=dlx;
Repeat
MoveTo(x,y0-3);LineTo(x,yO+3); // засечка
cross:=cross-l;
if cross = 0 then// оцифровка
Begin
TextOut(x-8,y0+5,FloatToStr(lx));
cross:=dcross ;
end;
Pen.Style:=psDot;
MoveTo(x,y0-3);LineTo(x,y0-h); // линия сетки
Pen.Style:=psSolid;
lx:=lx+dlx;
x:=x+dx;
until (x>x0+w);
// засечки, сетка и оцифровка по оси Y
y:=y0-dy;
ly:=dly;
Repeat
MoveTo(х0-3,у);LineTo(х0+3,у); // засечка
TextOut(х0-20,у,FloatToStr(1у)); // оцифровка
Pen.Style:=psDot; // пунктирная(короткая) линия
MoveTo(х0+3,у); LineTo(x0+w,у); // линия сетки
Pen.Style:=psSolid; // сплошная линия
y:=y-dy;
ly:=ly+dly;
until (y<y0-h);
end;
end;
End.
Ломаная линия
Метод polyline вычерчивает ломаную линию. В качестве параметра метод получает массив типа TPoint. Каждый элемент массива представляет собой запись, поля х и у которой содержат координаты точки перегиба ломаной. Метод Polyline вычерчивает ломаную линию, последовательно соединяя прямыми точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д.
Var
gr: array[1..50] ofTPoint; // график — ломаная линия
x0,y0: integer; // координаты точки начала координат
dx,dy: integer; // шаг координатной сетки по осям X и Y
i: integer;
Begin
х0 := 10; у0 := 200; dx :=5;dy := 5;
// заполним массив gr
fori:=l to50 do begin
gr[i].x := x0 + (i-l)*dx;
gr[i].y := y0 - Data[i]*dy;
end;
// строим график
withforml.Canvas do begin
MoveTo(x0,y0); LineTo(x0,10); // ось Y
MoveTo(x0,y0); LineTo(200,y0); // ось X
Polyline(gr); // график
end;
end;
Метод Polyline можно использовать для вычерчивания замкнутых контуров. Для этого надо, чтобы первый и последний элементы массива содержали координаты одной и той же точки.
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TForm1 = class(TForm)
procedureFormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private{ Private declarations }
public{ Public declarations }
end;
varForml: TForml;
Implementation
{$R *.dfm}
// вычерчивает звезду
procedureStarLine(x0,y0,r: integer; Canvas: TCanvas);
// x0,y0 — координаты центра звезды
//r — радиус заезды
Var
р : array [1.. 11] ofTPoint;
// массив координат лучей и впадин
a: integer; // угол между осью ОХ и прямой, соединяющей
// центр звезды и конец луча или впадину
i: integer;
Begin
а := 18; // строим от правого гор. луча
fori:=l to10 do begin
if(i mod2=0) then begin// впадина
p[i].x := x0+Round(r/2*cos(a*pi/180) ) ;
p[i].y:=y0-Round(r/2*sin(a*pi/180) ) ;
End
else begin// луч
[i].x:=x0+Round(r*cos (a*pi/180) ) ;
[i].y:=y0-Round(r*sin(a*pi/180) ) ;
end;
a := a+36;
end;
p[ll].X := p[l].X; // чтобы замкнуть контур звезды
Canvas.Polyline(р) ; // начертить звезду
end;
// нажатие кнопки мыши
procedureTForm1.FormMouseDown(Sender:TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
ifButton = mbLeft // нажата левая кнопка?
thenForm1.Canvas.Pen.Color : = clRed
elseForm1.Canvas.Pen.Color := clGreen;
StarLine(x, y, 30, Forml. Canvas );
end;
End.
Рис.10.5. Звезда
Примечание
Обратите внимание, что размер массива р на единицу больше, чем количество концов и впадин звезды, и что значения первого и последнего элементов массива совпадают.
Окружность и эллипс
Объект.Canvas.Ellipse(x1,y1,х2,у2)
где:
- объект — имя объекта (компонента), на поверхности которого выполняется вычерчивание;
- x1, y1, х2, у2 — координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, окружность (рис. 10.6).
Рис. 10.6. Значения параметров метода Ellipse определяют вид геометрической фигуры
Дуга
Объект.Canvas.Arc(x1,y1,х2,у2,х3,у3,х4,у4)
где:
- x1, y1, х2, у2 — параметры, определяющие эллипс (окружность), частью которого является вычерчиваемая дуга;
- х3, у3 — параметры, определяющие начальную точку дуги;
- х4, у4 — параметры, определяющие конечную точку дуги.
Дуга вычерчивается против часовой стрелки от начальной точки к конечной (рис. 10.7).
Рис. 10.7. Значения параметров метода Arc определяют дугу как часть эллипса (окружности)
Прямоугольник
Объект.Canvas.Rectangle(x1,y1,x2,y2)
где:
- объект — имя объекта (компонента), на поверхности которого выполняется вычерчивание;
- x1, y1 и х2, у2 — координаты левого верхнего и правого нижнего углов прямоугольника.
Метод RoundRec тоже вычерчивает прямоугольник, но со скругленными углами. Объект.Canvas.RoundRec(x1,y1,х2, у2, х3, у3)
где:
- x1, y1, х2, у2 -- параметры, определяющие положение углов прямоугольника, в который вписывается прямоугольник со скругленными углами;
- х3 и у3 — размер эллипса, одна четверть которого используется для вычерчивания скругленного угла (рис. 10.8).
Рис. 10.8. Метод RoundRec вычерчивает прямоугольник со скругленными углами
procedureTForm1.Button1Click(Sender: TObject);
Var
r1, r2: TRect; // координаты углов прямоугольников
Begin
// заполнение полей структуры
// зададим координаты углов прямоугольников
r1 := Rect(20,20,60,40);
r2 := Rect(10,10,40,50);
with fоrm1.Canvas do begin
Brush.Color := clRed;
FillRect(r1); // закрашенный прямоугольник
Brush.Color := clGreen;
FrameRect(r2}; // только граница прямоугольника
end;
end;
Многоугольник
Метод Polygon вычерчивает многоугольник
Ниже приведена процедура, которая, используя метод polygon, вычерчивает треугольник:
procedureTForm1.Button2Click(Sender: TObject);
Var
pol: array[1..3] ofTPoint; // координаты точек треугольника
Begin
pol[1].x := 10;
polf1].y := 50;
pol[2].x := 40;
pol[2].y := 10;
pol[3].х := 70;
pol[3].у := 50;
Forml.Canvas.Polygon(pol);
end;
Сектор
Объект. Canvas. Pie(x1,y1,x2,y2,х3,у3,х4,у4)
где:
- x1, y1, х2, у2 — параметры, определяющие эллипс (окружность), частью которого является сектор;
- х3, у3, х4, у4 — параметры, определяющие координаты конечных точек прямых, являющихся границами сектора.
Рис. 10.9. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)
Точка
Form1.Canvas.Pixels[10,10]:=clRed окрашивает точку поверхности формы в красный цвет.
Размерность массива pixels определяется размером графической поверхности. Размер графической поверхности формы (рабочей области, которую также называют клиентской) задается значениями свойств ClientWidth и ClientHeight, а размер графической поверхности компонента image — значениями свойств Width и Height. Левой верхней точке рабочей области формы соответствует элемент pixels [0,0], а правой нижней - Pixels[Clientwidth - 1,ClientHeight - 1].
Например, если некоторая функция f(x) может принимать значения от нуля до 1000, и для вывода ее графика используется область формы высотой в 250 пикселов, то масштаб оси Y вычисляется по формуле: т = 250/1000. Таким образом, значению f(x) = 70 будет соответствовать точка с координатой Y =233. Значение координаты Y вычислено по формуле
Y= h -f(x) ´ m = 250 – 70 ´ (250/1000),
где h - высота области построения графика.
Примеры построения графиков функций у = 2 sin(x) ex/5.
Interface
usesWindows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
Type
TForm1 = class(TForm)
procedureFormPaint(Sender: TObject);
procedureFormResize(Sender: TObject);
private{ Private declarations }
public{Public declarations }
end;
varForm1: TForm1;
Implementation
{$R *.DFM}
// Функция, график которой надо построить
Functionf(x:real):real;
Begin
f:=2*Sin(x)*exp(x/5) ;
end;
// строим график функции
procedureGrOfFunc;
Var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
х:real; // аргумент функции
у:real; // значение функции в точке х
dx:real; // приращение аргумента
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
х0,у0:integer; // точка — начало координат
Begin
// область вывода графика
l:=10; // X — координата левого верхнего угла
b:=Form1.ClientHeight-20; //У — координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
х2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); //максимум
x:=x1;
Repeat
У := f (х);
ifу < y1theny1:=y;
ifу > у2theny2:=y;
х:=x+dx;
until (x >= х2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
х0:=1;
у0:=b-Abs(Round(y1*my));
withform1.Canvas do
Begin
// оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));{универсальный формат}
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1;
Repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until(x >= x2);
end;
end;
procedureTForm1.FormPaint(Sender: TObject);
beginGrOfFunc; end;
// изменился размер окна программы
procedureTForm1.FormResize(Sender: TObject);
Begin
// очистить форму
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
End.
Основную работу выполняет процедура GrOfFunc, которая сначала вычисляет максимальное (у2) и минимальное (yl) значения функции на отрезке [x1,x2]. Затем, используя информацию о ширине (Forml.Clientwidth -40) и высоте (Form1.ClientHeight - 40) области вывода графика, вычисляет масштаб по осям X (mх) иY(mу).
Высота и ширина области вывода графика определяется размерами рабочей (клиентской) области формы, т. е. без учета области заголовка и границ. После вычисления масштаба процедура вычисляет координату у горизонтальной оси (уо) и вычерчивает координатные оси графика. Затем выполняется непосредственное построение графика (рис. 10.10).
Вызов процедуры GrOfFunc выполняют процедуры обработки событий OnPaint и OnFormResize. Процедура TForm1.FormPaint обеспечивает вычерчивание графика после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы, например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Процедура TForm1.FormResize обеспечивает вычерчивание графика после изменения размера формы.
Рис. 10.10. График, построенный процедурой GrOfFunc
Примечание
Рассмотренная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу следует внести изменения.
Программа вывода графика любой функции, используя компоненту Image
unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ExtCtrls;
Type
TForm1 = class(TForm)
Image1: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
function www(x:real):real ;
Begin
result:=x*x-3*x+2;
end;
procedure TForm1.Button1Click(Sender: TObject);
varx,y:real; i:integer;
Begin
if Edit1.Text<> '' then
Begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,501,501);
Image1.Canvas.MoveTo(0,251);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.MoveTo(251,0);
Image1.Canvas.LineTo(251,501);
Image1.Canvas.MoveTo(241,20);
Image1.Canvas.LineTo(251,0);
Image1.Canvas.LineTo(261,20);
Image1.Canvas.MoveTo(481,241);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.LineTo(481,261);
for i:=1 to 21 do begin
Image1.Canvas.MoveTo(i*25+1,246);
Image1.Canvas.LineTo(i*25+1,254);
Image1.Canvas.TextOut(i*25+1,255,FloatToStr(StrToInt(edit1.Text)/250*(i*25-250)));
Image1.Canvas.MoveTo(246,i*25+1);
Image1.Canvas.LineTo(254,i*25+1);
Image1.Canvas.TextOut(255,i*25+1,FloatToStr(- StrToInt(edit1.Text)/250*(i*25-250)));
end;
Image1.Canvas.TextOut(240,10,'y');
Image1.Canvas.TextOut(480,230,'x');
x:=StrToInt(edit1.Text)/250*(-250);
y:=www(x);
Image1.Canvas.MoveTo(round(X/Strtoint(Edit1.Text)*250+251),
round(-Y/StrToInt(Edit1.Text)*250+251));
fori:=2 to 501 do begin
x:=StrToInt(edit1.Text)/250*(i-251);
y:=www(x);
Image1.Canvas.LineTo(round(X/Strtoint(Edit1.Text)*250+251),
round(- Y/StrToInt(Edit1.Text)*250+251)); end
End
else ShowMessage('введите масштаб');
end;
procedure TForm1.FormCreate(Sender: TObject);
Begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,501,501);
Image1.Canvas.MoveTo(0,251);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.MoveTo(251,0);
Image1.Canvas.LineTo(251,501);
Image1.Canvas.MoveTo(241,20);
Image1.Canvas.LineTo(251,0);
Image1.Canvas.LineTo(261,20);
Image1.Canvas.MoveTo(481,241);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.LineTo(481,261);
Image1.Canvas.TextOut(240,10,'y');
Image1.Canvas.TextOut(480,230,'x');
end;
procedure TForm1.N2Click(Sender: TObject);
begin close; end;
procedure TForm1.N1Click(Sender: TObject);
Begin
MessageDlg('программа рисует функцию, заданную в подпрограмме-функция. В окне масштаб вводится число отрезков на которые разбиваются координатные прямые',mtinformation,[mbok],0)
End; end.
Вывод иллюстраций
Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помощи компонента image, значок которого находится на вкладке Additionalпалитры (рис. 10.11).
Рис. 10.11. Значок компонента Image
В табл. 10.8 перечислены основные свойства компонента image.
Таблица 10.8. Свойства компонента image
Свойство | Определяет | ||
Picture Width, Height AutoSize Strech Visible | Иллюстрацию, которая отображается в поле компонента Размер компонента. Если размер компонента меньше размера иллюстрации, и значение свойств AutoSize и strech равно False, то отображается часть иллюстрации Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации Признак автоматического масштабирования иллюстрации в соответствии с реальным размером компонента. Чтобы было выполнено масштабирование, значение свойства AutoSize должно быть False Отображается ли компонент, и, соответственно, иллюстрация, на поверхности формы | ||
Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.
Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Loadокна Picture Editor(рис. 10.12). Чтобы запустить Image Editor, нужно в окне Object Inspectorвыбрать свойство Picture и щелкнуть на кнопке с тремя точками.
Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция
Form1.Image1.Picture.LoadFromFile('e:\temp\bart.bmp')
загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (image1).
Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).
Следующая программа, ее текст приведен в листинге 10.6, использует компонент image для просмотра иллюстраций, которые находятся в указанном пользователем каталоге. Диалоговое окно программы приведено на рис. 10.13.
Рис. 10.12. Окно Picture Editor
Рис. 10.13. Слайд-проектор
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms,Dialogs, ExtCtrls, StdCtrls, Menu
Type
TForm1 = class(TForm)
Image1: ТImage;
Button1: TButton;
procedureFormActivate(Sender: TObject);
procedureButton1Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
Var
Form1: TForm1;
aSearchRec : TSearchRec;
aPath : String;// каталог, в котором находятся иллюстрации
aFile : String;// файл иллюстрации
iw,ih: integer; // первоначальный размер компонента Image
Implementation
{$R *.DFM}
// изменение размера области вывода иллюстрации
// пропорционально размеру иллюстрации
ProcedureScaleImage;
Var
pw, ph : integer; // размер иллюстрации
scaleX, scaleY : real; // масштаб по Х и Y
scale : real; // общий масштаб
Begin
// иллюстрация уже загружена
// получим ее размеры
pw := Form1.Image1.Picture.Width;
ph := Form1.Image1.Picture.Height;
ifpw > iw // ширина иллюстрации больше ширины компонента Image
thenscaleX := iw/pw // нужно масштабировать
elsescaleX := 1;
if ph > ih // высота иллюстрации больше высоты компонента
then scaleY := ih/ph // нужно масштабировать
elsescaleY := 1;
// выберем наименьший коэффициент
if scaleX < scaleY
thenscale := scaleX
elsescale := scaleY;
// изменим размер области вывода иллюстрации
Form1.Image1.Height := Round(Form1.Image1.Picture.Height*scale)
Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);
// т. к. Strech = True и размер области пропорционален
// размеру картинки, то картинка масштабируется без искажений
end;
// вывести первую иллюстрацию
procedureFirstPicture;
Var
r : integer; // результат поиска файла
Begin
aPath := 'f:\temp\';
r := FindFirst(aPath+'*.bmp',faAnyFile,aSearchRec);
if r = 0then
begin// в указанном каталоге есть bmp-файл
aFile := aPath + aSearchRec.Name;
Form1.Image1.Picture.LoadFromFile(aFile); // загрузить
// иллюстрацию
ScaleImage; //-установить размер компонентаImage
r := FindNext(aSearchRec); // найти следующий файл
if r = 0 then// еще есть файлы иллюстраций
Form1.Button1.Enabled := True;
end;
end;
// вывести следующую иллюстрацию
ProcedureNextPicture();
Var
r : integer;
Begin
aFile := aPath + aSearchRec.Name;
Forml.Image1.Picture.LoadFromFile(aFile);
ScaleImage;
// подготовим вывод следующей иллюстрации
r := FindNext(aSearchRec); // найти следующий файл
ifr<>0
then// больше нет иллюстраций
Forml.Button1.Enabled := False;
end;
procedureTForm1.FormActivate(Sender: TObject);
Begin
Image1.AutoSize:=False; //запрет автоизменения размера
//компонента
Image1.Stretch := True; // разрешим масштабирование
// запомним первоначальный размер области вывода иллюстрации
iw := Image1.Width;
in := Image1.Height;
Button1.Enabled := False; // сделаем недоступной кнопку Дальше
FirstPicture; // вывести первую иллюстрацию
end;
//щелчок на кнопке Дальше
procedureTForm1.Button1Click(Sender: TObject);
Begin
NextPicture;
end;
End.
Программа выполняет масштабирование выводимых иллюстраций без искажения, чего нельзя добиться простым присвоением значения True свойству strech. Загрузку и вывод первой и остальных иллюстраций выполняют соответственно процедуры FirstPicture и NextPicture. Процедура FirstPicture использует функцию FindFirst для того, чтобы получить имя первого BMP-файла. В качестве параметров функции FindFirst передаются:
- имя каталога, в котором должны находиться иллюстрации;
- структура asearchRec, поле Name которой, в случае успеха, будет содержать имя файла, удовлетворяющего критерию поиска;
- маска файла иллюстрации.
Если в указанном при вызове функции FindFirst каталоге есть хотя бы один BMP-файл, значение функции будет равно нулю. В этом случае метод LoadFromFiie загружает файл иллюстрации, после чего вызывается функция ScaleImage, которая устанавливает размер компонента пропорционально размеру иллюстрации. Размер загруженной иллюстрации можно получить, обратившись к свойствамForm1.Image1.Picture.Width и Form1.Image1.Picture.Height, значения которых не зависят от размера компонента Image.
Глава 10
Графические возможности Delphi
Например, инструкция Form1.Canvas.Rectangle (10,10,100,100) вычерчивает в окне программы прямоугольник.
Холст
canvas — это объект типа TCanvas
.
Рис. 10.1. Координаты точек холста
Height и width ClientHeight и Clientwidth.
Карандаш и кисть
Реn (карандаш) и Brush (кисть), которые представляют собой объекты типа TPеп и TBrush, соответственно.
Карандаш
Таблица 10.1. Свойства объекта треп (карандаш)
Свойство | Определяет | ||
Color | Цвет линии | ||
Width | Толщину линии | ||
Style | Вид линии | ||
Mode | Режим отображения | ||
Таблица 10.2. Значение свойства Color определяет цвет линии
Константа | Цвет | Константа | Цвет | ||
clBlack | Черный | clSilver | Серебристый | ||
clMaroon | Каштановый | clRed | Красный | ||
clGreen | Зеленый | clLime | Салатный | ||
clOlive | Оливковый | clBlue | Синий | ||
clNavy | Темно-синий | clFuchsia | Ярко-розовый | ||
clPurple | Розовый | clAqua | Бирюзовый | ||
clTeal | Зелено-голубой | clWhite | Белый | ||
clGray | Серый | ||||
Таблица 10.3. Значение свойства Реn. Style определяет вид линии
Константа | Вид линии | ||
psSolid | Сплошная линия | ||
psDash | Пунктирная линия, длинные штрихи | ||
psDot | Пунктирная линия, короткие штрихи | ||
psDashDot | Пунктирная линия, чередование длинного и короткого штрихов | ||
psDashDotDot | Пунктирная линия, чередование одного длинного и двух коротких штрихов | ||
psClear | Линия не отображается (используется, если не надо изображать границу области, например, прямоугольника) | ||
Таблица 10.4. Значение свойства Реп. Mode влияет на цвет линии