关于鼠标双击的问题!(50分)

  • 主题发起人 主题发起人 shshshsh
  • 开始时间 开始时间
S

shshshsh

Unregistered / Unconfirmed
GUEST, unregistred user!
我发现窗口的鼠标双击还会触发单击事件,有什麽办法能禁止单击事件激活
只让它激活双击事件吗?
 
不会吧,哪个控件那么怪?
 
对不起,我知道了,你可以在FormClick里写一句:
Abort;
 
还有什麽别的办法,因为我还要用到单击,我只是想让窗口区别单击和双击!
 
controlstyle := controlstyle - [csClickEvents];
然后自己截获WM_LBUTTONDBLCLK消息:
例子:
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WMLButtonDblClk(var Message: TMessage); message WM_LBUTTONDBLCLK;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
controlstyle := controlstyle - [csClickEvents]
end;

procedure TForm1.WMLButtonDblClk(var Message: TMessage);
begin
if assigned(OnDblClick) then
OnDblClick(Self);
end;
 
我想,用时延来判断是单击还是双击,比如,当单击后,在鼠标双击时间间隔还未受到
双击消息,那么这次单击就只是单击,如果还受到双击消息,则这次是双击过程。
 
沈前卫:能不能举个例子?
多谢!
 
var
Dbl: Boolean;
{$R *.DFM}

procedure TForm1.FormClick(Sender: TObject);
var
n: Integer;
begin
// Timer1.Enabled := true;
n := GetTickCount;
while GetTickCount - n < 500 do
Application.ProcessMessages;
if Dbl then
begin
dbl := false;
exit;
end;
showmessage('Click');
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
Dbl := True;
showmessage('DblClick');
end;
 
//呵呵,这是个笨办法,看看高手们还有没有更简单的方法.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormDblClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
iCount:integer;
bClick:boolean;
bDblClick:boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
iCount:=0;
bClick:=False;
bDblClick:=False;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
bDblClick:=False;
iCount:=0;
bClick:=True;
Timer1.Enabled:=True;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
bDblClick:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if bClick then Inc(iCount);
if iCount>20 then
begin
Timer1.Enabled:=False;
ShowMessage('Click');
end else
if bDblClick then
begin
Timer1.Enabled:=False;
ShowMessage('DblClick');
end;
end;

end.
 
Grids.pas 中有处理单击和双击的例子,
请查找“GetDoubleClickTime”
 
Big_Z的的方法不错,不过原理都差不多。
 
各位高手:

小第我实在笨拙,big_z说的程序把我看晕了,还请大家为俺举个例子!
不胜感激!
 
仔细看了看,好象big_z方法还是不行,用我和Another_eYes的方法吧。
 
timer1.interval:=????
 
我曾经在写一个关于纪录鼠标和键盘所有的消息的程序。很惊奇的发现
Window竟然没有双击消息,产生双击的效果原来是通过在一定的时间两
次单击来实现的。并且Window从消息队列中发出来的消息,它并不知道
发给那一个窗口或哪一个对象。他仅仅知道发到触发消息的鼠标的位置。
至于,怎样解决shshshsh的问题:
我想:
procedure TForm1.Form1OnClick(Sender:TObject);
begin
Inherited;
end;
不过我没有试过。
 
timer1.interval=10;//自己先GetDoubleClickTime得到时间,在耕具此来在程序中设置。
 
多谢各位!
只是小弟我没分了!不能一一照顾大家,请求谅解!
分不多但是小弟的一番心意!
 
后退
顶部