
14.06.2014, 21:26
|
Прохожий
|
|
Регистрация: 14.06.2014
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
|
|
как перемещать прямоугольник с помощью мышки?
есть данная программа, которая создает закрашенные и не закрашенные прямоугольники, увеличивает, крутит и перемещает их, при этом проверяя границы 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.
|