form上有若干个Image控件,表示若干台设备。要在两个控件间画线,表示为设备添加连接。希望的效果是:用户单击一个控件,拖动鼠标,此时就有一条线段跟着鼠标而移动,两个端点分别是那个控件的中心位置和鼠标的当前位置(这部分本人已经实现)。当放开鼠标后,如果当前的鼠标位置在另一个控件上,则在这两个控件之间画线;如果当前的位置只是在form上,则什么都不做,原来的那条线也消失。现在的问题是,当我放开鼠标后,怎么判断当前的鼠标是否落在另一个控件上?我为每个Image控件写了MouseUP事件,但鼠标UP了以后只是触发了起点Image的UP事件,而不是终点的。所以没法判断线条的终点是否在另一个Image上。我该怎么做呢?请各位指点。多谢!

解决方案 »

  1.   

    可以捕捉image2的坐标,在这个范围里面就触发
      

  2.   

    写一个函数PointInImage
    MouseUp只(x,y)在image中的判断是: 
    (Image.left<x<Image.left+image.width) and (Image.top<y<Image.left+image.Height)
      

  3.   

    不是给image写mouseup吧~给form写~因该可以~
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, jpeg;type
      TForm1 = class(TForm)
        Image1: TImage;
        Image2: TImage;
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormCreate(Sender: TObject);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      started:boolean;
      op,lp,cp:TPoint;   //op orignal point lp:last point cp:current point
      hdc:THandle;
      cvs:TCanvas;
      correct:boolean;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=true;
      getcursorPos(op);
      lp.X:=op.X;
      lp.Y:=op.Y;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);begin
      if started then
      begin
        getcursorpos(cp);
        cvs.MoveTo(op.X,op.Y);
        cvs.LineTo(cp.X,cp.Y);
        cvs.MoveTo(op.X,op.Y);
        cvs.LineTo(lp.X,lp.Y);
      end;
      lp.X:=cp.X; lp.Y:=cp.Y;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      cvs:=TCanvas.create;
      cvs.Handle:=getdc(0);
      cvs.Pen.Color:=clred;
      cvs.Pen.Mode:=pmnot;
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=false;  getCursorPos(cp);
      if (cp.X>form1.Left+image2.Left) and (cp.Y>form1.Top+image2.Top) and
          (cp.X<form1.Left+image2.Left+image2.Width) and (cp.Y<form1.Top+image2.Top+image2.Height) then
      begin
        correct:=true;
      end
      else
        correct:=false;  if not correct then
      begin
        cvs.MoveTo(op.X,op.Y);
        cvs.LineTo(lp.X,lp.Y);
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=false;
      cvs.MoveTo(op.X,op.Y);
      cvs.LineTo(lp.X,lp.Y);
    end;end.