我用Canvas动态画了一些线,想通过单击这些线进入另一页面,但始终不知道怎么样触发这些线的单击事件。有没有高人可以指点一下,动态画的线究竟能否实现单击或双击事件??
        img.Canvas.MoveTo(ps.X, ps.Y);
       img.Canvas.LineTo(x1code[ii], y1code[ii]);
        Img.Canvas.TextOut(x1code[ii],y1code[ii],wname[ii]);   //显示线路名称

解决方案 »

  1.   

    在img的单击事件里判断点中的是哪一条线,再做相应的响应
      

  2.   

    sz_haitao,你好!
    能详细的指点一下吗 在img单击事件里怎么才能判定点中的线呢? 
      

  3.   

    就是每画一线,记住它的起止坐标到一个结构数组
    img每次点击时,用鼠标坐标与该数组计算判断是否符合某一条线
      

  4.   

    比如说我把线设置的较粗,只要点击到这根粗粗的线,都要产生单击事件."记住它的起止坐标到一个结构数组 
    img每次点击时,用鼠标坐标与该数组计算判断是否符合某一条线"好像不能实现呢? 我所画的每根线的起止坐标是已知的,都存在数据库里面,是通过读取数据库信息获得线的起止坐标再进行动态画线的.
      

  5.   

    已知点A(x,y,鼠标所点的),和线段的2个定点B(x1,y1)、C(x2,y2)
    判断A是否位于BC上对于每根线都做这样的判断
      

  6.   

    楼主似乎搞反了一个顺序,线是为了表现你的数据。
    1.也就是首先要有楼上所说的保存线的属性的结构(比如说直线方程,线的外观样式属性,乃至是否选中的标志等等)。
    2.Paint事件里面按照存储的数据结构表现你画的线,每条线可以使不同的外观样式(比如普通的线一种样式,选中的变色并加粗等等)。
    前两个步骤可以实现画线,这个过程是不用考虑选择的。
    3.实现选中线-单击时的光标位置和线条的坐标位置比较,无非就是两个点是否重合(完全相等或允许几个像素的误差)的简单算法。
    在一些工程制图软件中思路是这样的:
    (1)要表现的每条线肯定有数学关系比如直线方程y=a+bx,x通常好确定可以直接决定光标是否在线的横坐标上。x如果在直线上,那么进行第二步。
    (2)把光标的位置x带到方程算出一个y,然后比较这个y和光标的y是否重合,如果重合则修改对应的线条记录。
    (3)触发paint事件。思路如此,代码应该不难写了。
      

  7.   

    你必须保存你的线结构,就是线的起点和终点,然后判断鼠标坐标是否在线中。
    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;
      

  8.   

    搞成MVC那样的,线的数据模型是大头,显示和控制都是小头。