unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
label1.Caption:='in';
end;procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
label1.Caption:='out';
end;end.
我运行上面程序后,非得按住鼠标不放从窗口外里移动,label才会变,
为什么?不是mouseLeave,鼠标移开就可以了?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
label1.Caption:='in';
end;procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
label1.Caption:='out';
end;end.
我运行上面程序后,非得按住鼠标不放从窗口外里移动,label才会变,
为什么?不是mouseLeave,鼠标移开就可以了?
不过这样也可以的..这样改一下..
procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
if Integer(Label1)=Message.LParam then
begin
Label1.Caption:='in';
end;
end;因为窗体上任何一个TCONTROL都会把自己的CM_MOUSEENTER向PARENT传递...procedure TControl.CMMouseLeave(var Message: TMessage);
begin
if FParent <> nil then
FParent.Perform(CM_MOUSELEAVE, 0, Longint(Self));
end;
http://expert.csdn.net/Expert/topic/1747/1747226.xml?temp=9.144229E-02
你那的问题是另一回事,
从操作系统来看,如果鼠标离开某一个窗口,操作系统便不会传给这窗口鼠标消息,
除非这个窗口‘抓‘着鼠标。
同样的,当鼠标离开某应用程序的窗口,当前的应用程序进程便接收不到系统鼠标消息.相信你也注意过,在窗口之间的拖动处理的时候,常要用SetCapture函数来为指定窗口
抓住鼠标,让鼠标离开窗口也接受到它的消息.(使用HOOK,钩住全局的鼠标消息,那是另一回事,不提)
CM_MOUSEENTER,CM_MOUSELEAVE产生的思路不同的,它是VCL应用程序在处理空闲时候,
判断鼠标位置而内部产生的。
我的本意是鼠标离开窗体时,labe1变成out
鼠标进入窗体时,label1变成in
那CMMouseEnter,CMMouseLeave当然是写在整个窗体里了
按照你的方法是:鼠标移出label时,label显示out,
鼠标移入label时,label显示in
我调试了一下,可以的
我要实现的是:鼠标离开窗体时,labe1变成out
鼠标进入窗体时,label1变成in
代码就是我上面贴的,但是一定要按住鼠标不放才有效果有什么错误请指出,谢谢了
我觉得你还是用他本身的好..
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
private
{ Private declarations }
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
form1.Caption:='Mouse is in then form';
end;procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
form1.Caption:='Mouse out the form';
end;end.
程序运行没有达到我预期的结果,还是要按住鼠标移动才会有效果,为什么?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
var
Pt : TPoint ;
Rect : TRect ;
begin
GetCursorPos(Pt) ;
GetWindowRect(Handle,Rect) ;
if Not PtInRect(Rect,Pt) then
Label1.Caption := 'Out'
else
Label1.Caption := 'In' ;
end;end.
先给你一个歪解,放可以接受焦点的一个控件在窗体上,比如放一个TMEMO,不用写什么代码,再运行的程序,看看什么现象。
当然会有正解,我要想一下