onDoubleClick和onMouseDown事件中,各有各的功能,问题是,执行onDoubleClick事件时,同时引起了onMouseDown事件,该如何处理呢?
解决方案 »
- 请问如何产生一个Tshape?
- 如何使 ProgressBar1与MediaPlayer1的进度同步?
- 一个很简单的问题,答对有重奖
- 请教
- 一个菜鸟对与数组的困惑,XDJM们帮帮我啊
- 怎样恢复SQL2000数据库,给出原代码(要求用ADO),在线等
- 如何制作 动画的托盘图标(非高手勿入)
- 过来人请进---一个数据库管理系统作完了,打包时怎么办?
- 从ExtractIconEx得到的Icon存到ImageList控件里,使用于ListView,为什么屏蔽色(Mask)不起作用?,显示的图标周围有黑影?
- 如何在TRichEdit中实现超级链接???
- listview中间的线,怎么设置???
- Delphi 中动态创建窗体件 Edit.text 赋值
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