我的代码如下,大家看看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;
发现,双击控件,不只产生mousedown事件,还产生mousemove事件如果去掉Self.SetBounds(Self.Left + X - OldLeft, Self.Top + Y - OldTop, Self.Width,Self.Height); 则双击后,可产生切换窗体大小的效果,但不能拖动窗体了。该如何解决这个冲突呢?
设置一个判断鼠标down 与 up间隔的 全局变量 i: Mousedown i:=gettickcount; mouseup i:=gettickcount-i; if i<100 then //判断为双击 需要恢复mousemove的动作 dblclick: if i<100 then //判断为双击
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;
则双击后,可产生切换窗体大小的效果,但不能拖动窗体了。该如何解决这个冲突呢?
i:
Mousedown
i:=gettickcount;
mouseup
i:=gettickcount-i;
if i<100 then //判断为双击
需要恢复mousemove的动作
dblclick:
if i<100 then //判断为双击
测试了一下,这个方法有问题。
按下鼠标,执行i:=gettickcount;
弹起鼠标,执行i:=gettickcount-i;
在ondubleclick中判断i值,来确实此次操作是否为双击。问题是,现在是要求是,如果是双击(目的是切换窗体的大小),则不能执行mousemove中的Self.SetBounds,在这时候判断i值,mousemove事件中的SetBounds已经执行了,也就是说判断发生在了SetBounds执行之后,所以这个判断没什么意义。
i:=gettickcount;mousmove
i:=gettickcount-i;
if i<50 then //判断为双击,不需要执行mousemove的动作,退出这样把由快速双击而产生的 mousemove 事件给过滤掉了,从而消除了mousemove事件中SetBounds语句对双击事件中计算窗体大小和位置的影响。
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;
解决拖动问题双击的用你的
ReleaseCapture;
SendMessage(handle, wm_SysCommand, SC_MAXIMIZE, 0) else//最大化
SendMessage(handle, wm_SysCommand, SC_RESTORE, 0)//恢复
两次MouseDown的时间比较短判定为DoubleClick事件这时只响应onDoubleClic
两次MouseDown的时间较长判定为2次MouseDown事件 这时只响应onMouseDown