УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ МАКСИМА ТАНКА» кафедра прикладной математики и информатики ОТЧЕТ по вычислительной практике Выполнил: студент 407 группы математического факультета Петров И.А. Руководитель: преподаватель кафедры прикладной математики и информатики Иванов А.И. Минск, 2010 ЗАДАНИЕ Разработать приложение «Подвижные точки», в окне которого отображается произвольный четырехугольник на клетчатом поле. Вершины четырехугольника можно перемещать с помощью манипулятора «мышь». Курсор мыши, при наведении на вершину, изменяет внешний вид, позволяя перетаскивать точку в любое другое место поля. При перемещении вершины связанные с ней отрезки, следуя за ней, также изменяют свою длину и направление. Окно приложения должно иметь строку заголовка с названием приложения, кнопки управления окном и строку состояния, в которой отображаются текущие координаты курсора мыши. РЕЗУЛЬТАТ Окно работающего приложения имеет следующий вид (рис. 1). Рис. 1. Окно приложения «Подвижные точки» Приложение представлено файлом DragPoint.exe. Рабочие материалы находятся в папке ВП_Петров_405 (вычислительная практика_фамилия_номер группы). ЛИСТИНГ unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TMainForm = class(TForm) Image: TImage; StatusBar: TStatusBar; procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure FormCreate(Sender: TObject); procedure ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private procedure Draw(Canvas : TCanvas); // рисовать ломаную procedure Grids(Canvas : TCanvas); // рисовать сетку public end; {-------------------------------------------------------------} type TIntPoint = record x,y : integer; end; TMouseMode = (mNormal, mMove); // режимы использования мыши {-------------------------------------------------------------} var A,B,C,D: TIntPoint; numb : byte; // номер выбранной точки MouseMode: TMouseMode; // режим использования мыши {-------------------------------------------------------------} implementation {-------------------------------------------------------------} procedure TMainForm.Grids(Canvas : TCanvas); { Рисовать сетку } const h = 25; // шаг сетки var x,y : integer; begin with Canvas do begin Brush.Color:=clWhite; FillRect(ClipRect); // очистить холст Pen.Color:= RGB(32,196,168); (* Рисуем линии *) x:= 0; while x <= ClientWidth do begin MoveTo(x,0); LineTo(x,ClientHeight); x:= x + h; end; y:= 0; while y <= ClientHeight do begin MoveTo(0,y); LineTo(ClientWidth,y); y:= y + h; end; end; end; {-------------------------------------------------------------} procedure TMainForm.Draw(Canvas : TCanvas); { Рисовать ломаную } begin with Canvas do begin Brush.Color:= clRed; Ellipse(A.x-3,A.y-3,A.x+3,A.y+3); Ellipse(B.x-3,B.y-3,B.x+3,B.y+3); Ellipse(C.x-3,C.y-3,C.x+3,C.y+3); Ellipse(D.x-3,D.y-3,D.x+3,D.y+3); Pen.Color:= clBlue; MoveTo(A.x,A.y); LineTo(B.x,B.y); LineTo(C.x,C.y); LineTo(D.x,D.y); LineTo(A.x,A.y); end; end; procedure TMainForm.FormCreate(Sender: TObject); begin MouseMode:= mNormal; // режим использования мыши A.x:= 25; B.x:= 125; C.x:= 375; D.x:= 400; A.y:= 250; B.y:= 75; C.y:= 25; D.y:= 240; with Image.Picture.Bitmap do begin Width:=Image.Width; Height:=Image.Height; Grids(Canvas); // сетка Canvas.Pen.Mode:= pmNotXor; // нужен этот режим пера Draw(Canvas); // первоначальная ломаная end; end; {-------------------------------------------------------------} procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y : Integer); {-------------------------------------------------------------} function YesPoint(p: TIntPoint) : Boolean; begin YesPoint:= (X <= p.x+3) and (X >= p.x-3) and (Y <= p.y+3) and (Y >= p.y-3); end; {------------------------------------------------------------} begin StatusBar.Panels[0].Text:= Format( 'Координаты: X = %d, Y = %d',[X,Y]); if MouseMode = mNormal then begin { обычный режим } if YesPoint(A) or YesPoint(B) or YesPoint(C) or YesPoint(D) then Screen.Cursor:= crHandPoint // курсор-рука else begin Screen.Cursor:= crArrow; // курсор-стрелка end end else begin { режим перетаскивания } Draw(Image.Picture.Bitmap.Canvas); // убрать старый рисунок case numb of 1: begin A.x:= X; A.y:= Y end; 2: begin B.x:= X; B.y:= Y end; 3: begin C.x:= X; C.y:= Y end; 4: begin D.x:= X; D.y:= Y end; end; Draw(Image.Picture.Bitmap.Canvas); // новый рисунок ломаной end end; {-------------------------------------------------------------} procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); {-------------------------------------------------------------} function YesPoint(p: TIntPoint) : Boolean; begin YesPoint:= (X <= p.x+3) and (X >= p.x-3) and (Y <= p.y+3) and (Y >= p.y-3); end; {-------------------------------------------------------------} begin MouseMode:= mMove; // режим использования мыши { какая из четырех точек выбрана } if YesPoint(A) then numb:= 1; if YesPoint(B) then numb:= 2; if YesPoint(C) then numb:= 3; if YesPoint(D) then numb:= 4; end; {-------------------------------------------------------------} procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin numb:= 0; // никакая точка не выбрана MouseMode:= mNormal; // режим использования мыши end; {-------------------------------------------------------------} end. ПОЯСНЕНИЯ На форме размещены два объекта из палитры компонентов: Image для отображения рисунка и StatusBar для строки состояния. Объекты наделены свойствами (рис. 2). Для создания графических изображений в области некоторых компонент, например в нашем случае TImage, используется свойство Canvas. Класс TCanvas имеет свойства: Pen: TPen устанавливает цвет, толщину, стиль линий и границ геометрических фигур; Brush: TBrush – цвет и шаблон кисти; Font: TFont – параметры текста; PenPos: TPoint – выдает текущую позицию пера; Pixels : TColor – двухмерный массив, содержащий цвета пикселей. С помощью Canvas создается изображение клетчатого поля для объекта Image, а также изображения вершин и линий четырехугольника. Рис. 2. Свойства объектов Image При инициализации формы и StatusBar выполняются следующие действия: и т.д.…