首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么在图片上创建多个选区来获得坐标

2012-03-09 
如何在图片上创建多个选区来获得坐标?各位好,我想用delphi做个软件,这个软件打开一个图片,并在图片上创建

如何在图片上创建多个选区来获得坐标?
各位好,我想用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. 


[解决办法]

探讨
要是有现成的控件就好了

热点排行