各位好,我想用delphi做个软件,这个软件打开一个图片,并在图片上创建多个选区来获得选区的坐标信息。这些选区是独立的,那个通过鼠标拖动来移动位置,也能够通过鼠标拖动来改变大小,请问这样的功能该如何去实现呢?谢谢

解决方案 »

  1.   

    写了个简单的,在form上画的,可以移动图像,没有做缩放大小的,但是画出来四个锚点,你可以完善一下,就是判断鼠标是否在四个锚点内,然后改变坐标,类似改变位置的操作
    还可以将图像封装成一个类,每个图形对象有自己的鼠标事件,这些自己可以完善unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      //图形坐标
      TGraphCoord = record
        StartPoint:TPoint;
        EndPoint:TPoint;
        //是否选中
        Selected:Boolean;
      end;
      PGraphCoord = ^TGraphCoord;
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormPaint(Sender: TObject);
      private
        { Private declarations }
        FPointList: TList;
        OldX,OldY,NewX,NewY:Integer;
        Drawing:Boolean;
        FSelected:PGraphCoord;
        procedure Draw;
        procedure DrawSide(p:PGraphCoord);
        function GetSelected(x,y:Integer):PGraphCoord;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}//遍历List中的对象,依次画到Form上
    procedure TForm1.Draw;
    var
      i:Integer;
      coord:TGraphCoord;
    begin
      for i := 0 to FPointList.Count - 1 do
      begin
        coord := TGraphCoord(FPointList.Items[i]^);
        Self.Canvas.Rectangle(coord.StartPoint.X,coord.StartPoint.Y,coord.EndPoint.X,coord.EndPoint.Y);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FSelected := nil;
      FPointList := TList.Create;
      Drawing := False;
      Self.DoubleBuffered := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //控制是否在画图中
      Drawing := not Drawing;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      NewX := X;
      NewY := Y;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      OldX := X;
      OldY := Y;
      if not Drawing then
      begin
        FSelected := GetSelected(X,Y);
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      p:^TGraphCoord;
    begin
      if FSelected <> nil then        //如果有图形被选中,那么修改位置
      begin
        FSelected.StartPoint.X := FSelected.StartPoint.X + (NewX-OldX);
        FSelected.StartPoint.Y := FSelected.StartPoint.Y + (NewY-OldY);
        FSelected.EndPoint.X := FSelected.EndPoint.X + (NewX-OldX);
        FSelected.EndPoint.Y := FSelected.EndPoint.Y + (NewY-OldY);
        Invalidate;
      end;
      if not Drawing then Exit;
      NewX := X;
      NewY := Y;
      New(p);
      p.StartPoint := Point(OldX,OldY);
      p.EndPoint := Point(NewX,NewY);
      FPointList.Add(p);
      Invalidate;
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
      Draw;
      DrawSide(FSelected);
    end;//画四个锚点
    procedure TForm1.DrawSide(p: PGraphCoord);
    begin
      if p = nil then Exit;
      Self.Canvas.Rectangle(p.StartPoint.X-2,p.StartPoint.Y-2,p.StartPoint.X+2,p.StartPoint.Y+2);
      Self.Canvas.Rectangle(p.StartPoint.X-2,p.StartPoint.Y+(p.EndPoint.Y-p.StartPoint.Y)-2,p.StartPoint.X+2,p.StartPoint.Y+(p.EndPoint.Y-p.StartPoint.Y)+2);
      Self.Canvas.Rectangle(p.StartPoint.X+(p.EndPoint.X-p.StartPoint.X)-2,p.StartPoint.Y-2,p.StartPoint.X+(p.EndPoint.X-p.StartPoint.X)+2,p.StartPoint.Y+2);
      Self.Canvas.Rectangle(p.EndPoint.X-2,p.EndPoint.Y-2,p.EndPoint.X+2,p.EndPoint.Y+2);
    end;//获取哪个图形被选中
    function TForm1.GetSelected(x,y:Integer): PGraphCoord;
    var
      i:Integer;
      p:PGraphCoord;
    begin
      Result := nil;
      for i := 0 to FPointList.Count - 1 do
      begin
        p := PGraphCoord(FPointList.Items[i]);
        if (x>=p.StartPoint.X) and (x<=p.EndPoint.X) and (y>=p.StartPoint.Y) and (y<=p.EndPoint.Y) then
        begin
          Result := p;
          p.Selected := True;
          Break;
        end;
      end;
      Invalidate;
    end;end.
      

  2.   

    谢谢楼上的bdmh,我先自己验证一下