![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() ![]() есть данная программа, которая создает закрашенные и не закрашенные прямоугольники, увеличивает, крутит и перемещает их, при этом проверяя границы image(630x513). Если нажать кнопку переместить, то программа запросит "на сколько пикселей" ![]() так вот собственно проблема, необходимо сделать так, чтобы перемещение происходило при нажати и движении мышкой как это сделать объектно ориентированном способом не представляю ![]() вот собственно код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ColorGrd, StdCtrls, ExtCtrls, ComCtrls, Buttons; type TPoly = class Points: array [0..3] of TPoint;//массив, содержащий координаты фигуры CenterPoint: TPoint;// точка центра фигуры. PenColor, BrushColor: TColor;// цвет фигуры constructor Create(CornersAmount:integer); virtual; procedure Move(newX,newY: Integer);// перемещение procedure Draw(cnv: TCanvas);virtual;//рисование procedure ChangeSize(k:real);//изменение размера procedure Center;//вычисление геометрического центра фигуры procedure Turn(An: Real);// вращение фигуры end; TPram = class(tPoly) constructor Create(CornersAmount:integer); override; procedure Draw(cnv: TCanvas); override; end; TForm1 = class(TForm) Panel1: TPanel; RadioGroup1: TRadioGroup; Image1: TImage; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; ColorGrid1: TColorGrid; Edit3: TEdit; Label1: TLabel; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure ColorGrid1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; cur: tPoly; k: integer; Bitmap: tBitmap; cnv:tcanvas; mdown,perem:boolean; implementation {$R *.dfm} constructor tPoly.Create(CornersAmount:integer);// параметр задает количество точек фигуры var s, c: Integer; begin PenColor:=clBlack; Randomize; s:=random(100); c:=random(300); Points[0].x:=random(form1.Image1.Width-s); Points[0].Y:=random(form1.Image1.Height-s); Points[2].X:=points[0].x+c; Points[2].Y:=points[0].y+s; points[3].X:=points[2].X; points[3].Y:=points[0].Y; points[1].X:=points[0].X; points[1].Y:=points[2].Y; Center; end; constructor TPram.Create(CornersAmount:integer); var s, c: Integer; begin PenColor:=clBlack; Randomize; s:=random(100); c:=random(300); Points[0].x:=random(form1.Image1.Width-s); Points[0].Y:=random(form1.Image1.Height-s); Points[2].X:=points[0].x+c; Points[2].Y:=points[0].y+s; points[3].X:=points[2].X; points[3].Y:=points[0].Y; points[1].X:=points[0].X; points[1].Y:=points[2].Y; Center;//вычисляем центр фигуры end; procedure tPoly.Draw(cnv:Tcanvas); begin cnv.Pen.Color:=PenColor; cnv.Brush.Color:=BrushColor; cnv.polygon(Points); end; procedure TPram.Draw(cnv:tcanvas); begin cnv.Pen.Color:=PenColor; cnv.Brush.Color:=BrushColor; cnv.polygon(Points); end; procedure TPoly.Move(newX,newY: Integer); var i:integer; begin CenterPoint.X:=newX+CenterPoint.X; CenterPoint.Y:=newY+CenterPoint.Y; for i:=0 to 3 do begin Points[i].X:=Points[i].X+newx; Points[i].Y:=Points[i].y+newy; end; if (Points[0].X>630) or (Points[0].Y<1) or (Points[0].Y>513) or (Points[0].X<1)or (Points[1].X>630) or (Points[1].Y<1) or (Points[1].Y>513) or (Points[1].X<1)or (Points[2].X>630) or (Points[2].Y<1) or (Points[2].Y>513) or (Points[2].X<1)or (Points[3].X>630) or (Points[3].Y<1) or (Points[3].Y>513) or (Points[3].X<1) then begin CenterPoint.X:=newX+CenterPoint.X; CenterPoint.Y:=newY+CenterPoint.Y; for i:=0 to 3 do begin Points[i].X:=Points[i].X-newx; Points[i].Y:=Points[i].y-newy; end; showmessage('Фигура за границами экрана!'); end; end; procedure TPoly.ChangeSize(k:real); var i: integer; TempPoint: TPoint; begin for i:=0 to 3 do begin TempPoint.X:=round((Points[i].X-CenterPoint.X)*k+CenterPoint.X); TempPoint.Y:=round((Points[i].Y-CenterPoint.Y)*k+CenterPoint.Y); Points[i]:=TempPoint; end; if (Points[0].X>630) or (Points[0].Y<1) or (Points[0].Y>513) or (Points[0].X<1)or (Points[1].X>630) or (Points[1].Y<1) or (Points[1].Y>513) or (Points[1].X<1)or (Points[2].X>630) or (Points[2].Y<1) or (Points[2].Y>513) or (Points[2].X<1)or (Points[3].X>630) or (Points[3].Y<1) or (Points[3].Y>513) or (Points[3].X<1) then begin showmessage('Фигура за границами экрана! ВВедите заново') ; for i:=0 to 3 do begin TempPoint.X:=round((Points[i].X-CenterPoint.X)/k+CenterPoint.X); TempPoint.Y:=round((Points[i].Y-CenterPoint.Y)/k+CenterPoint.Y); Points[i]:=TempPoint; end; end; end; procedure TPoly.Center; begin CenterPoint.X:=(Points[0].X + Points[2].X)div 2; CenterPoint.Y:=(Points[0].Y + Points[2].Y)div 2; end; procedure TPoly.Turn(An: Real); var i: integer; TempPoint: TPoint; begin for i:=0 to 3 do begin TempPoint.X:=CenterPoint.X+round((Points[i].X-CenterPoint.X)*cos(an)-(Points[i].Y-CenterPoint.Y)*sin(an)); TempPoint.Y:=CenterPoint.Y+round((Points[i].X-CenterPoint.X)*sin(an)+(Points[i].Y-CenterPoint.Y)*cos(an)); Points[i]:=TempPoint; end; if (Points[0].X>630) or (Points[0].Y<1) or (Points[0].Y>513) or (Points[0].X<1)or (Points[1].X>630) or (Points[1].Y<1) or (Points[1].Y>513) or (Points[1].X<1)or (Points[2].X>630) or (Points[2].Y<1) or (Points[2].Y>513) or (Points[2].X<1)or (Points[3].X>630) or (Points[3].Y<1) or (Points[3].Y>513) or (Points[3].X<1) then begin showmessage('Фигура за границами экрана!'); for i:=0 to 3 do begin TempPoint.X:=CenterPoint.X+round((Points[i].X-CenterPoint.X)*cos(an)+(Points[i].Y-CenterPoint.Y)*sin(an)); TempPoint.Y:=CenterPoint.Y+round((Points[i].X-CenterPoint.X)*sin(an)-(Points[i].Y-CenterPoint.Y)*cos(an)); Points[i]:=TempPoint; end; end; end; procedure TForm1.FormShow(Sender: TObject); begin bitmap:= Tbitmap.Create; bitmap.Width:= Image1.Width; bitmap.Height:= Image1.Height; Image1.Picture.Assign(bitmap); end; procedure TForm1.Button1Click(Sender: TObject); label zaramkami; begin zaramkami: If radiogroup1.itemindex=0 then begin Cur:= TPram.Create(4); // прямоугольник Cur.PenColor:=colorgrid1.BackgroundColor; Cur.BrushColor:= clwhite; Cur.Draw(Image1.Canvas); end else begin Cur:= TPoly.Create(4); //закрашенный прямоугольник Cur.PenColor:= colorgrid1.BackgroundColor; Cur.BrushColor:= colorgrid1.ForegroundColor; Cur.Draw(image1.Canvas); end; if (cur.Points[0].X>630) or (cur.Points[0].Y<1) or (cur.Points[0].Y>513) or (cur.Points[0].X<1)or (cur.Points[1].X>630) or (cur.Points[1].Y<1) or (cur.Points[1].Y>513) or (cur.Points[1].X<1)or (cur.Points[2].X>630) or (cur.Points[2].Y<1) or (cur.Points[2].Y>513) or (cur.Points[2].X<1)or (cur.Points[3].X>630) or (cur.Points[3].Y<1) or (cur.Points[3].Y>513) or (cur.Points[3].X<1) then begin Cur.Free; Image1.Picture.Assign(bitmap); goto zaramkami ; end; button1.Enabled:= false; button2.Enabled:= true; button3.Enabled:= true; button4.Enabled:= true; button5.Enabled:= true; end; procedure TForm1.Button2Click(Sender: TObject); begin Cur.Free; Image1.Picture.Assign(bitmap); button1.Enabled:=true; button1.Enabled:=true; button2.Enabled:= false; button3.Enabled:= false; button4.Enabled:= false; button5.Enabled:= false; end; procedure TForm1.Button3Click(Sender: TObject); var sx,sy: string; dx,dy: integer; begin if not inputquery('Перемещение по Х','Положительное число - вправо, отрицательное - влево:',sx) then sx:='0'; if not inputquery('Перемещение по Y','Положительное число - вниз, отрицательное - вверх:',sy) then sy:='0'; dx:=strtoint(sx); dy:=strtoint(sy); Image1.Picture.Assign(bitmap); Cur.Move(dX, dY); Cur.Draw(Image1.Canvas); { perem:=true; } end; procedure TForm1.Button4Click(Sender: TObject); var k:real; begin k:=strtofloat(edit3.Text); Image1.Picture.Assign(bitmap); Cur.ChangeSize(k); Cur.Draw(Image1.Canvas); end; procedure TForm1.Button5Click(Sender: TObject); var s:string; r:integer; begin if not inputquery('Поворот фигуры', 'На сколько градусов повернуть?', s) then s:= '0'; r:= StrToInt(s); Image1.Picture.Assign(bitmap); Cur.Turn(r*pi/180); Cur.Draw(Image1.Canvas); end; procedure TForm1.ColorGrid1Change(Sender: TObject); begin Image1.Picture.Assign(bitmap); Cur.PenColor:= Colorgrid1.BackgroundColor; Cur.BrushColor:= Colorgrid1.ForegroundColor; Cur.Draw(Image1.Canvas); end; end. |
#2
|
||||
|
||||
![]() Собственно само перемещение у вас почти сделано, вот только у вас ведь не одна фигура будет на канве и к тому-же они могут перекрывать друг друга полностью или частично. Отсюда возникает необходимость заведения переменной отвечающей за слой в котором находится ваша фигура. И отсюда же возникает необходимость отрисовки стопки фигур с обработкой перекрытия. Все это на самом деле не столь сложно, т.к. многое уже реализовано в свойствах канвы. Вот после реализации этого можно уже прицепить обработчик перемещения мыши на каждую из фигур. И вам еще потребуется класс-контейнер для ваших фигур.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
![]() Тут есть даже пару примеров перемещения графических объектов на области: http://www.delphisources.ru/pages/so...rch-graph.html
К сожалению не помню названий исходников |