如何在图片上创建多个选区来获得坐标? 各位好,我想用delphi做个软件,这个软件打开一个图片,并在图片上创建多个选区来获得选区的坐标信息。这些选区是独立的,那个通过鼠标拖动来移动位置,也能够通过鼠标拖动来改变大小,请问这样的功能该如何去实现呢?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写了个简单的,在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. 谢谢楼上的bdmh,我先自己验证一下 想在messagebox上显示1,2,全部,取消四个按钮,能实现吗? 数据库 字符串操作时,函数insert(s1,s2,3)和关键字insert重复了?????急急急 问一个关于动态创建ODBC数据源的问题 关于文件复制的问题 怎样用SQL语句按条件把数据库某个字段值全部相加 一个算法上的问题 使用ado连接sql数据库,对数据库的操作问题? ***Sql Server的难题*** 大侠,谁开发过纽曼小秘书书啊??? 请教delphi自动填写表单问题 高手!!! 关于 delphi调用 C++ 控件方法 中olevariant参数的问题????
还可以将图像封装成一个类,每个图形对象有自己的鼠标事件,这些自己可以完善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.