如何创建OnMouseLeave事件?
答案 0 :(得分:8)
Andreas解决方案的另一种替代方法是使用已在delphi 7中定义的CM_MOUSELEAVE
VCL消息。
使用TButton
type
TButton = class(StdCtrls.TButton)
private
FOnMouseLeave: TNotifyEvent;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
procedure ButtonMouseLeave(Sender: TObject);
public
end;
//handle the message and call the event handler
procedure TButton.CMMouseLeave(var Message: TMessage);
begin
if (Message.LParam = 0) and Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
procedure TForm1.ButtonMouseLeave(Sender: TObject);
begin
//your code goes here
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//assign the event
Button1.OnMouseLeave:=ButtonMouseLeave;
end;
答案 1 :(得分:6)
当鼠标离开控件时,您可以告诉Windows向您发送消息,更具体地说是WM_MOUSELEAVE
消息。为此,请调用TrackMouseEvent
功能。在TRACKMOUSEEVENT
结构中,指定TME_LEAVE
标志。
根据要求提供一些代码:
当创建控件并且鼠标位于控件的客户区域内时,告诉Windows您希望收到有关鼠标离开控件的通知:
procedure TMyControl.SetMouseEvent;
var
tme: TTrackMouseEvent;
begin
tme.cbSize := sizeof(tme);
tme.dwFlags := TME_LEAVE;
tme.hwndTrack := Self.Handle;
TrackMouseEvent(tme);
end;
在创建控件并且鼠标位于控件内部时调用此过程。现在你只需要听WM_MOUSELEAVE
消息。在WndProc
过程(该类的受保护成员)中,添加WM_MOUSELEAVE
个案例。
procedure TMyControl.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_MOUSELEAVE:
beep;
end;
end;
我认为Windows会在创建邮件时删除通知请求,因此您必须在收到邮件后重新请求通知。您无法在SetMouseEvent
中呼叫WndProc
,因为当您致电TrackMouseEvent
时,鼠标需要位于控件的客户区域内。我想您可以将SetMouseEvent
放在控件的OnMouseMove
内:
procedure TMyControl.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_MOUSELEAVE:
beep;
WM_MOUSEMOVE:
SetMouseEvent;
end;
end;
我自己没有测试过上面的代码,因为我使用的是Delphi的新版本Delphi 2009,它在幕后做了类似的事情(我想,因为控件中现在有OnMouseLeave
个事件),我认为这会干扰。