Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.06.2014, 21:26
leraleraera leraleraera вне форума
Прохожий
 
Регистрация: 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.
Ответить с цитированием
  #2  
Старый 15.06.2014, 13:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Собственно само перемещение у вас почти сделано, вот только у вас ведь не одна фигура будет на канве и к тому-же они могут перекрывать друг друга полностью или частично. Отсюда возникает необходимость заведения переменной отвечающей за слой в котором находится ваша фигура. И отсюда же возникает необходимость отрисовки стопки фигур с обработкой перекрытия. Все это на самом деле не столь сложно, т.к. многое уже реализовано в свойствах канвы. Вот после реализации этого можно уже прицепить обработчик перемещения мыши на каждую из фигур. И вам еще потребуется класс-контейнер для ваших фигур.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 15.06.2014, 13:41
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,531
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Тут есть даже пару примеров перемещения графических объектов на области: http://www.delphisources.ru/pages/so...rch-graph.html

К сожалению не помню названий исходников
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter