做了一个简易的直线的控件,当直线在前面的时候,直线周围的矩形域也会出现,会遮住后面的图形,导致点击后面的图形时,无法触发事件。所以做一个判断,如果点击直线周围一定的区域,触发直线的事件,如果不在指定区域,则需要向下层控件发送被点击的消息,我想请问大家,怎样向下层控件发送被点击的消息?

解决方案 »

  1.   

    其实就是作了一个简易的直线的控件TLine,可以属性:颜色,粗细,两端点,onpaint,onclick,在一个form的oncreate里动态的创建几个(比如,四个)image(载入图片),(不是直接拖放到form上的),根据在这四个image的坐标,在他们之间动态的创建几条直线Tline,我想实现:通过拖动image它们之间的连线是固定的,但是发现在拖动这些image时很困难,分析原因是这些直线周围的矩形框的影响,所以image当被遮住时,需要向他们发送被点击的消息,我的拖动实现如下:
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
        (source as TImage).Left:=x;
        (source as TImage).Top:=y;
    end;
      

  2.   

    SendMessage(Button2.Handle,WM_LBUTTONDOWN,0,0);
      SendMessage(Button2.Handle,WM_LBUTTONUP,0,0);
    你想做到什么效果,其实只要给隐藏了的控件发送消息即可!
      

  3.   

    但是当在这个直线的矩形框的外面的区域的时候,可以随意拖动,当你拖着一个image在窗体上滑动的时候,遇到直线的矩形框,根本就无法拖动,
      

  4.   

    procedure TLinLine.WMLMouseDown(var Message: TMessage);
    begin
    FPosX := Message.LParamLo;
    FposY := Message.LParamHi;if not NearLine(FPosX ,FPosY) then//如果不在直线的周围的指定的区域
    begin
    SendMessage(****.Handle,WM_LBUTTONDOWN,0,0);//向下层控件发送被点击的消息
    exit;
    end;
    怎样去确定哪一个image的handle呢?如果直线的矩形框下有多个image 呢?
      

  5.   

    如果不是窗口控件,该控件是没有接收消息句柄的,如果是窗口控件,作为绘图程序用,如果有上
    千上万线条,内存开销太大,
    所有你的问题最好是程序检测鼠标(选择时)位置是否是在该控件位置上,来判断是否激活下面的控件。
    不知道你的TLine类从什么类继承下来的,如果从TCOMPONENT类继承下来,可以通过
    if not (csDesigning in ComponentState) then FHWnd := AllocateHWnd(CommWndProc);
    来申请一个消息句柄来使用。