Константы свойства Style
Константа |
Тип заполнения области |
bsSolid |
Сплошная заливка |
bsClear |
Область не закрашивается |
bsHorisontal |
Горизонтальная штриховка |
bsVertical |
Вертикальная штриховка |
bsFDiagonal |
Диагональная штриховка с наклоном линий вперед |
bsBDiagonal |
Диагональная штриховка с наклоном линий назад |
bsCross |
Горизонтально-вертикальная штриховка, в клетку |
bsDiagCross |
Диагональная штриховка, в клетку |
Таким образом, для изображения закрашенной фигуры перед использованием соответствующего метода (Chord, Ellipse, Pie, Polygon и др.) необходимо установить цвет и стиль её закраски (Brush.Color и Brush.Style).
Свойство канвы Font (шрифт) определяет параметры шрифта, которым выводится текст на холсте. Эти параметры устанавливаются через его свойства. Некоторые из них приведены ниже:
Таблица 6
Константы свойства Font
Свойство |
Назначение |
Name |
Определяет вид (название) шрифта (Arial, Times New Roman, Courier, и т.д.) |
Size |
Pазмер шрифта в пунктах (points). Один пункт равен 1/72 дюйма. |
Style |
Стиль начертания символов (курсив, полужирный, подчеркнутый, перечеркнутый) |
Color |
Цвет символов |
Для вывода текста на поверхность графического объекта используется метод TextOut. Он определен следующим образом:
procedure TextOut(X,Y: Integer; Text: String);
Строка текста Text пишется на канве, начиная с позиции с координатами (X, Y). Надпись делается в соответствии с текущими установками шрифта Font. Фон надписи определяется установками текущей кисти Brush (если нет необходимости в фоне для надписи, то перед выводом текста свойству Brush.Color нужно присвоить значение bsClear или задать цвет кисти, совпадающий с цветом поверхности, на которую выводится текст). После вывода текста текущая позиция PenPos пера Pen перемещается к концу выведенного текста.
Перечисленные свойства и методы представляют далеко не все графические возможности Delphi. Однако, они покрывают около 80% потребностей, обычно возникающих при работе с графикой.
Прежде, чем перейти к примерам, необходимо сказать непосредственно о порядке создания изображения. Как отмечалось выше, канва представляет собой область, на которой можно рисовать или отображать готовые изображения. Она является свойством компонента Image, и для рисования на форму сначала помещают этот компонент, а затем на его канве с помощью указанных выше свойств и методов создают изображение - записывают код в обработчик какого-либо события, например OnPaint. Как указывалось ранее, канву имеют не только компонент Image, но и другие компоненты среды программирования, например, форма. То есть, все, что рисуется на компоненте Image, может рисоваться и непосредственно на форме.
В качестве примера рассматривается программа построения домика.
В программе константами задаются относительные размеры элементов домика (задается доля, которую составляет рассматриваемый размер от ширины или высоты формы). Цвет фона и цвет рисования также заданы константами. При рисовании домика можно использовать процедуру рисования прямоугольника, но в дальнейшем при написании программы анимации домика (вращение) необходимо рисовать прямоугольник произвольной ориентации, поэтому воспользоваться процедурой Rectangle будет нельзя.
Также при реализации вращения нельзя работать с массивом целочисленных координат, т.к. это приведет к потере точности и искажению изображения. Чтобы не переделывать программу можно сразу работать с действительными величинами, а при использовании процедур рисования обращаться к функции округления.
unit domik;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
xmax,ymax:integer;
hd, //высота домика
ld, //ширина домика
ldo, //ширина окна
hdo, //высота окна
rdo, //радиус окна на чердаке
hkr, //высота чердака
hram :real; //высота верхней части рамы окна
const kl = 1.0 / 6.0; //отношение ширины домика к ширине формы
kh = 1.0 / 8.0; //отношение высоты домика к высоте формы
kkr = 1.0 / 24.0; //отношение высоты чердака к высоте формы
klo = 2.0 / 3.0; //отношение ширины окна к ширине домика
kho = 2.0 / 3.0; //отношение высоты окна к высоте домика
kro = 1.0 / 4.0; //отношение радиуса окна на чердаке к высоте
//чердака
khram = 1.0 / 4.0; //отношение высоты верхней части рамы к высоте
// домика
nn=14;
cris=clRed;
cf=clWhite;
klkn=1/7; // относительные размеры кнопок
khkn=1/20; // (доля высоты и ширины кнопок от ширины и высоты формы)
var x,y:array[1..nn] of real;
implementation
{$R *.dfm}
//Рисование домика
procedure ris;
var i:integer;
begin
With Form1.Canvas do
begin
//рисование домика
//Rectangle(x[2],y[2],x[5],y[5]); можно использовать
//эту процедуру, но при вращении надо рисовать прямоугольник отрезками
MoveTo(round(x[1]),round(y[1]));
for I := 2 to 5 do
LineTo(round(x[i]),round(y[i]));
LineTo(round(x[1]),round(y[1]));
MoveTo(round(x[2]),round(y[2]));
LineTo(round(x[4]),round(y[4]));
MoveTo(round(x[2]),round(y[2]));
LineTo(round(x[3]),round(y[3]));
LineTo(round(x[4]),round(y[4]));
//рисование окна
//Rectangle(x[7],y[7],x[9],y[9]);
MoveTo(round(x[6]),round(y[6]));
for I := 7 to 9 do
LineTo(round(x[i]),round(y[i]));
LineTo(round(x[6]),round(y[6]));
MoveTo(round(x[10]),round(y[10]));
LineTo(round(x[11]),round(y[11]));
MoveTo(round(x[13]),round(y[13]));
LineTo(round(x[12]),round(y[12]));
//рисование окна на чердаке
Ellipse(round(x[14]-rdo),round(y[14]-rdo),round(x[14]+rdo),
round(y[14]+rdo));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with Canvas do
begin
Brush.Color:=cf;
Brush.Style:=bsSolid;
Rectangle(0,0,xmax,ymax);
Pen.Color:=cris;
ris;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
xmax:=ClientWidth;
ymax:=ClientHeight;
hd := kh * ymax;
ld := kl * xmax;
ldo := klo * ld;
hdo := kho * hd;
hkr := kkr * ymax;
rdo := kro * hkr;
hram := khram * hdo;
//расчет координат вершин домика
x[1]:=(xmax/2-ld/2); y[1]:=(ymax/2+hd/2);
x[2]:=x[1]; y[2]:=(y[1]-hd);
x[3]:=(x[2]+ld/2); y[3]:=(y[2]-hkr);
x[4]:=(x[2]+ld); y[4]:=y[2];
x[5]:=x[4]; y[5]:=y[1];
//расчет координат вершин окна
x[6]:=(x[1]+(ld-ldo)/2); y[6]:=(y[1]-(hd-hdo)/2);
x[7]:=x[6]; y[7]:=(y[6]-hdo);
x[8]:=(x[7]+ldo); y[8]:=y[7];
x[9]:=x[8]; y[9]:=y[6];
x[10]:=x[6]; y[10]:=(y[7]+hram);
x[11]:=x[8]; y[11]:=y[10];
x[12]:=x[3]; y[12]:=y[10];
x[13]:=x[12]; y[13]:=y[6];
x[14]:=x[12]; y[14]:=(y[3]+hkr/2);
//расчет размеров кнопок
Button1.Width:=round(klkn*xmax);
Button1.Height:=round(khkn*ymax);
Button2.Width:=round(klkn*xmax);
Button2.Height:=round(khkn*ymax);
Button1.Top:=ymax-4*Button1.Height;
Button1.Left:=xmax-Button1.Width;
Button2.Top:=ymax-2*Button2.Height;
Button2.Left:=xmax-Button2.Width;
end;
//обработчик события - изменение размеров формы
procedure TForm1.FormResize(Sender: TObject);
begin
FormCreate(Sender);
Button1Click(Sender);
end;
end.