我用Canvas动态画了一些线,想通过单击这些线进入另一页面,但始终不知道怎么样触发这些线的单击事件。有没有高人可以指点一下,动态画的线究竟能否实现单击或双击事件??
img.Canvas.MoveTo(ps.X, ps.Y);
img.Canvas.LineTo(x1code[ii], y1code[ii]);
Img.Canvas.TextOut(x1code[ii],y1code[ii],wname[ii]); //显示线路名称
img.Canvas.MoveTo(ps.X, ps.Y);
img.Canvas.LineTo(x1code[ii], y1code[ii]);
Img.Canvas.TextOut(x1code[ii],y1code[ii],wname[ii]); //显示线路名称
能详细的指点一下吗 在img单击事件里怎么才能判定点中的线呢?
img每次点击时,用鼠标坐标与该数组计算判断是否符合某一条线
img每次点击时,用鼠标坐标与该数组计算判断是否符合某一条线"好像不能实现呢? 我所画的每根线的起止坐标是已知的,都存在数据库里面,是通过读取数据库信息获得线的起止坐标再进行动态画线的.
判断A是否位于BC上对于每根线都做这样的判断
1.也就是首先要有楼上所说的保存线的属性的结构(比如说直线方程,线的外观样式属性,乃至是否选中的标志等等)。
2.Paint事件里面按照存储的数据结构表现你画的线,每条线可以使不同的外观样式(比如普通的线一种样式,选中的变色并加粗等等)。
前两个步骤可以实现画线,这个过程是不用考虑选择的。
3.实现选中线-单击时的光标位置和线条的坐标位置比较,无非就是两个点是否重合(完全相等或允许几个像素的误差)的简单算法。
在一些工程制图软件中思路是这样的:
(1)要表现的每条线肯定有数学关系比如直线方程y=a+bx,x通常好确定可以直接决定光标是否在线的横坐标上。x如果在直线上,那么进行第二步。
(2)把光标的位置x带到方程算出一个y,然后比较这个y和光标的y是否重合,如果重合则修改对应的线条记录。
(3)触发paint事件。思路如此,代码应该不难写了。
uses
Math;procedure TForm1.FormCreate(Sender: TObject);
begin
FStart := Point(100, 100);
FEnd := Point(10, 10);
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
dx, dy: Integer;
sx, sy: Single;
begin
dx := Abs(FEnd.X - FStart.X);
dy := Abs(FEnd.Y - FStart.Y);
if (dx > 0) and (dy > 0) then
begin
sx := Abs(X - FStart.X) / dx;
sy := Abs(y - FStart.Y) / dy;
if (sx >= 0) and (sx <= 1) and (sy >= 0) and (sy <= 1) and SameValue(sx, sy, 0.02) then
ShowMessage('Click Me');
end
else if (dx > 0) then
begin
sx := Abs(X - FStart.X) / dx;
if (sx >= 0) and (sx <= 1) then
ShowMessage('Click Me');
end
else if (dy > 0) then
begin
sy := Abs(y - FStart.Y) / dy;
if (sy >= 0) and (sy <= 1) then
ShowMessage('Click Me');
end;
end;procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.MoveTo(FStart.X, FStart.Y);
Canvas.LineTo(FEnd.X, FEnd.Y);
end;