Смекни!
smekni.com

Учебно-методическое пособие для студентов физико-математических специальностей вузов Балашов (стр. 11 из 18)

procedure FormCreate(Sender: TObject);

private

LineDrawing:Boolean; {Эта переменная равна True, если программа находится в режиме рисования}

BegX,BegY:Integer; {Начала "резиновой" линии}

OldX,OldY:Integer; {Последняя точка "резиновой" линии.}

procedure Line(X1,Y1,X2,Y2:Integer);

end;

procedure LineDrawRandom(X,Y:Integer;Canvas:TCanvas);stdcall;

begin

Canvas.Pixels[X,Y]:=RGB(Random(256),Random(256),Random(256))

end;

{Процедура LineDrawXXX - это функции косвенного вызова (callback-функции) для LineDDE.}

procedure TForm1.Line;

begin

LineDDA(X1,Y1,X2,Y2,@LineDrawRandom,Integer(Canvas));

end;

procedure TForm1.FormMouseDown (Sender:TObject; Button:TMouseButton; Shift: TShiftState; X,Y:Integer);

begin

if Button=mbLeft then

begin

MouseCapture:=True;

OldX:=X; OldY:=Y;

BegX:=X; BegY:=Y;

LineDrawing:=True

{При нажатии на левую кнопку мыши начинаем рисовать "резиновую" линию. Инициализируем все переменные и захватываем мышь в монопольное пользование.}

end

end;

procedure TForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);

begin

if LineDrawing and ((X<>OldX) or (Y<>OldY)) then

with Canvas do

begin

SetROP2(Handle,R2_Not);

Line(BegX,BegY,OldX,OldY); {Стираем старую линию}

Line(BegX,BegY,X,Y); {Рисуем новую}

OldX:=X;

OldY:=Y

end

end;

procedure TForm1.FormMouseUp(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);

begin

if (Button=mbLeft) and LineDrawing then

begin

Line(BegX,BegY,X,Y);

LineDrawing:=False;

MouseCapture:=False

end

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

LineDrawing:=False;

end;

Пример 5

Рассмотрим пример построение графика произвольной функции. Данная задача может быть решена различными способами. Остановимся на варианте, когда определяется массив точек, а затем строится график функции, используя метод Polyline. Точка определяется типом TPoint, который является записью и содержит два поля: соответственно координату x и y.

Function f(x:real):Real;

Begin

f:=sin(x);

End;

procedure TForm1.Button1Click(Sender: TObject);

var

gr:array[1..50] of TPoint; {График — ломаная линия}

x0,y0:integer; {Координаты точки начала координат}

dx,dy:integer; {Шаг координатной сетки по осям X и Y}

i: integer;

begin

x0:=10; y0:=200; dx:=5; dy:=5;

for i:=1 to 50 do {Заполним массив gr }

begin

gr[i].x:=x0+(i-1)*dx;

gr[i].y:=y0-Round(f(gr[i].x))*dy;

end;

with form1.Canvas do

begin

MoveTo(x0,y0); LineTo(x0,10); {Ось Y}

MoveTo(x0,y0); LineTo(200,y0); {Ось X}

Polyline(gr); {График }

end;

end;

Теперь рассмотрим компоненты для создания изображений.

Компонент TShape с закладки Addition представляет собой простейшие графические объекты на форме типа круг, квадрат и т. п. Вид объекта указывается в свойстве Shape. Свойство Pen определяет цвет и вид границы объекта, Brush задает цвет и вид заполнения объекта. Эти свойства можно менять как во время дизайна, так и во время выполнения программы. TBevel — компонент с той же закладки, является объектом для украшения программы, может принимать вид рамки или линии. Объект предоставляет меньше возможностей по сравнению с TPanel, но не занимает ресурсов. Внешний вид указывается с помощью свойств Shape и Style.

Помимо простейших построений имеется возможность обрабатывать более сложные изображения. Для работы с такими изображениями используются специальные объекты. Обычно изображения хранятся отдельно от обрабатывающего объекта в соответствующем файле или потоке.

Вначале рассмотрим классы, которые позволяют обрабатывать изображения. TBitmap (класс — растровые изображения), TIcon (класс — пиктограммы Windows), TMetafile (класс — векторное изображение или метафайлы). Все эти классы являются потомками абстрактного класса TGraph, который не имеет возможности работать с графическими изображениями, но содержит все ключевые свойства и методы, например: свойства Height, Width задающие высоту и ширину содержащегося в данном классе изображения, логические свойства Empty и Modified, первое из которые определяет, содержит ли объект графическое изображение, а второе — было ли модифицировано изображения. Методы LoadFromFile(FileName: String) и SaveToFile(FileName: String) соответственно загружают изображение из файла или сохраняют его в файле. Данные методы перекрываются
в каждом дочернем классе. Имеется возможность описывать переменные рассмотренных выше классов, но нельзя просматривать их содержимое, поскольку нет соответствующих методов.

Любое графическое изображение должно быть помещено в объект класса TPicture, который является надстройкой над изображением и дает ему новые возможности. Являясь надстройкой, сам класс не имеет никаких графических средств и не может самостоятельно обрабатывать включенное в него изображение. Но у него есть несколько особых свойств, например: Graphic — типа TGraphic, которые определяют тип включенного изображения и свойства Bitmap, Icon, MetaFile соответствующих классов, которые определяют вид включенного изображения. При затребовании объекта другого класса, прежний объект, хранящийся в поле, будет уничтожен.

Компонент Image со страницы Additional позволяет поместить графическое изображение в любое место на форме. Картинку можно загрузить во время проектирования в редакторе свойства Picture (инспектор объектов). В этом случае открывается диалоговое окно, где с помощью кнопки Load можно осуществлять просмотр и выбор изображения, которое должно храниться в файле формата BMP (bitmap), WMF или EMF (Windows Meta File), ICO (icon). Как известно, форматов хранения изображений гораздо больше трех вышеназванных (например, наиболее известны PCX, GIF, TIFF, JPEG). Для включения в программу изображений в этих форматах нужно либо перевести их в формат BMP, либо использовать дополнительные модули.

Следует помнить, что изображение, помещенное на форму во время проектирования, включается в файл проекта и затем при компиляции добавляется к EXE-файлу. Поэтому такой EXE-файл может получиться достаточно большой. Как альтернативу рассмотрим загрузку картинки во время выполнения программы. Для этого у свойства Picture воспользуемся методом LoadFromFile.

Важными являются свойства объекта Image и логические свойства AutoSize, Center и Stretch. Если Center установлено в True, то центр изображения будет совмещаться с центром объекта TImage. Если Stretch установлено в True, то изображение будет сжиматься или растягиваться таким образом, чтобы заполнить весь объект, а если свойство AutoSize будет иметь значение True, то подобным образом будет вести себя сам объект.

Кроме перечисленных выше свойств, объект TImage обладает свойством Canvas, которое позволяет выполнять построения.

Пример 6

Создать программу, которая в зависимости от переключателя будет либо сжимать до необходимого размера изображение, либо выдавать его в естественном виде. Поместим на форму компоненты CheckBox, Image, OpenPictureDialog, Button и опишем следующую процедуру обработки нажатия на кнопку:

procedure TForm1.Button1Click(Sender: TObject);

begin

If CheckBox1.Checked

Then

begin

Image1.AutoSize:=True;Image1.Stretch:=False;

end

Else

begin

Image1.AutoSize:=False;Image1.Stretch:=True;

end;

OpenPictureDialog1.Filter:=GraphicFilter(TGraphic);

If OpenPictureDialog1.Execute

Then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName)

end;

Пример 7

В заключение рассмотрим пример создания простейшего графического редактора. Основная работа, т. е. рисование, будет происходить на компоненте Image, диалоговое окно ColorDialog необходимо нам для выбора цвета, а переключатель с независимой фиксацией RadioGroup будет предназначен для выбора инструмента рисования. Две дополнительные кнопки будут служить для вызова диалогового окна выбора цвета либо для очистки формы. Разместив все необходимые компоненты, получим вид формы, изображенный на рисунке 22.

Рисунок 22

Основная программа имеет следующий вид:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Image1: TImage;

RadioGroup1: TRadioGroup;

ColorDialog1: TColorDialog;

Button1: TButton;

Button2: TButton;

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

x1,y1:integer; i:integer;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

i:=i+1;

image1.Canvas.Brush.Style:=bsclear;

case RadioGroup1.ItemIndex of

0:if odd(i) then

image1.Canvas.Rectangle(x1,y1,x,y) else

begin

x1:=x; y1:=y;

end;

1:if odd(i) then

image1.canvas.Ellipse(x1,y1,x,y)

else

begin

x1:=x; y1:=y;

end;

2:if odd(i) then

image1.canvas.lineto(x,y)

else

begin

x1:=x; y1:=y;

image1.Canvas.MoveTo(x1,y1);

end;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

i:=1;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if ColorDialog1.Execute

then image1.Canvas.Pen.color:=colordialog1.color;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

image1.Canvas.Pen.Color:=clwhite;

image1.Canvas.Brush.Style:=bssolid ;

image1.canvas.Rectangle(0,0,225,305);

image1.Canvas.Pen.Color:=clblack;

end;

end.

Данную программу достаточно легко модифицировать таким образом, чтобы все фигуры строились при повторном нажатии. Кроме этого, можно добавить возможности построения произвольных фигур, закраски замкнутой области, различных распылителей.

Задания:

1. Проверьте все примеры из лабораторной работы.

2. Доработайте редактор, чтобы можно было сохранять и загружать рисунок.

Лабораторная работа 8. Компоненты-меню
и элементы интерфейса

Цель: изучить возможности при создании меню и дополнительных элементов интерфейса.

Практически все сложные программы в настоящее время обладают системным меню, предназначенным для выбора того или иного пути выполнения программы. Системное меню представляет собой либо древовидную структуру, а следовательно, элемент меню может быть либо подменю, либо командой, либо разделительной линией, если имеется несколько групп. Существуют два различных типа меню: MainMenu (главное меню) и PopurMenu (локальное меню), которые находятся на странице Standart. Если главное меню отождествляется с формой, то локальное меню — с тем или иным компонентом управления. У различных компонентов управления могут быть различные локальные меню, следовательно, на форме может находиться только одно главное меню и несколько локальных меню. Для того чтобы связать любой элемент управления с локальным меню, необходимо свойству PopurMenu задать имя нужного локального меню.