当鼠标离开我的控件时,如何触发事件?

时间:2011-04-27 14:40:07

标签: delphi events mouse delphi-7

如何创建OnMouseLeave事件?

2 个答案:

答案 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个事件),我认为这会干扰。