如何在图片上创建多个选区来获得坐标?
各位好,我想用delphi做个软件,这个软件打开一个图片,并在图片上创建多个选区来获得选区的坐标信息。这些选区是独立的,那个通过鼠标拖动来移动位置,也能够通过鼠标拖动来改变大小,请问这样的功能该如何去实现呢?
谢谢
[解决办法]
写了个简单的,在form上画的,可以移动图像,没有做缩放大小的,但是画出来四个锚点,你可以完善一下,就是判断鼠标是否在四个锚点内,然后改变坐标,类似改变位置的操作
还可以将图像封装成一个类,每个图形对象有自己的鼠标事件,这些自己可以完善
- Delphi(Pascal) code
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.
[解决办法]