onDoubleClick和onMouseDown事件中,各有各的功能,问题是,执行onDoubleClick事件时,同时引起了onMouseDown事件,该如何处理呢?

解决方案 »

  1.   

    我的代码如下,大家看看var
      Form1: TForm1;
      Moving  : Boolean;
      OldX, OldY,oldleft,oldtop : Integer;
    implementation{$R *.dfm}//按下鼠标时,记录下窗体位置,并开始拖动窗体
    procedure TForm1.imgCaptionMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      If Button = mbLeft Then
      Begin
        OldLeft := X;
        OldTop := Y;
        Moving := True;
      End;
    end;//移动鼠标时拖动窗体
    procedure TForm1.imgCaptionMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      If Moving Then Self.SetBounds(Self.Left + X - OldLeft, Self.Top + Y - OldTop, Self.Width,Self.Height);
    end;//鼠标弹起后停止拖动窗体
    procedure TForm1.imgCaptionMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      If Button = mbLeft Then Moving := False;
    end;//双击时在最大化和指定尺寸之间切换窗体
    procedure TForm1.imgCaptionDblClick(Sender: TObject);
    begin
      if self.WindowState=wsMaximized then
      begin
        Self.WindowState:=wsNormal;
        self.Width:=800;
        self.Height:=600;
        self.Left:=(screen.Width-self.Width) div 2;
        Self.Top:=(Screen.Height-self.Height) div 2;
      end
      else
      begin
        Self.WindowState:=wsMaximized;
      end;
    end;
      

  2.   

    发现,双击控件,不只产生mousedown事件,还产生mousemove事件如果去掉Self.SetBounds(Self.Left + X - OldLeft, Self.Top + Y - OldTop, Self.Width,Self.Height);
    则双击后,可产生切换窗体大小的效果,但不能拖动窗体了。该如何解决这个冲突呢?
      

  3.   

    设置一个判断鼠标down 与 up间隔的 全局变量
    i:
    Mousedown
    i:=gettickcount;
    mouseup
    i:=gettickcount-i;
    if i<100 then //判断为双击
    需要恢复mousemove的动作
    dblclick:
     if i<100 then //判断为双击
     
      

  4.   


    测试了一下,这个方法有问题。
    按下鼠标,执行i:=gettickcount;
    弹起鼠标,执行i:=gettickcount-i;
    在ondubleclick中判断i值,来确实此次操作是否为双击。问题是,现在是要求是,如果是双击(目的是切换窗体的大小),则不能执行mousemove中的Self.SetBounds,在这时候判断i值,mousemove事件中的SetBounds已经执行了,也就是说判断发生在了SetBounds执行之后,所以这个判断没什么意义。
      

  5.   

    根据frtrnr的思路,问题得以解决了,方法如下设置一个判断鼠标down 与 move间隔的 全局变量 iMousedown
      i:=gettickcount;mousmove
      i:=gettickcount-i;
      if i<50 then //判断为双击,不需要执行mousemove的动作,退出这样把由快速双击而产生的 mousemove  事件给过滤掉了,从而消除了mousemove事件中SetBounds语句对双击事件中计算窗体大小和位置的影响。
      

  6.   

    你做的就是 无标题窗口的拖动 和最大化 其实没那么复杂
    procedure TForm1.imgCaptionMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        if (button=mbleft) and not (WindowState   =   wsMaximized ) then
        begin
          ReleaseCapture;
          Perform (WM_syscommand,$f012,0);
        end;
    end;
    解决拖动问题双击的用你的
      

  7.   

      双击用下面的也可以 
      ReleaseCapture;
         SendMessage(handle, wm_SysCommand, SC_MAXIMIZE, 0) else//最大化
         SendMessage(handle, wm_SysCommand, SC_RESTORE, 0)//恢复
      

  8.   

    楼主还是自己重编DoubleClick和MouseDown事件吧
    两次MouseDown的时间比较短判定为DoubleClick事件这时只响应onDoubleClic
    两次MouseDown的时间较长判定为2次MouseDown事件 这时只响应onMouseDown
      

  9.   

    10楼的朋友的方法很好,使用发送系统消息实现拖动,代码简洁,性能高。但是,跟我的方法实现的效果稍有不同。发送系统消息实现拖动的效果是,一个虚线框在移动,跟wendows拖动文件夹窗口一样。我的方法是,拖动时窗体是实时移动的。
      

  10.   

    win7在拖动的时候 已经是实时移动了,xp才是虚线框