【问题标题】:How can I trigger an event when the mouse leaves my control?当鼠标离开我的控制时如何触发事件?
【发布时间】:2011-04-27 14:40:06
【问题描述】:

如何创建 OnMouseLeave 事件?

【问题讨论】:

  • 您希望在哪个组件中创建(或分配)此事件?
  • TCustomControl,我正在创建我自己的 unicode 按钮。 :)
  • 创建自己的 Unicode 按钮听起来相当痛苦,因为 Delphi 已经有了一个。当然不是 Delphi 7,但如果你坚持使用过时的工具,你就会瘫痪自己。
  • 是的,我感谢您来自拉脱维亚并且 Unicode 很重要。这就是为什么您应该认真考虑使用 Unicode Delphi,然后这些问题就会消失,您可以继续编码。
  • @TheBlastOne:我认为 Delphi 7 是 Delphi 最后一个针对爱好者的免费版本。我也认为这就是为什么 Delphi 7 仍然如此广泛使用的原因。

标签: delphi events mouse delphi-7


【解决方案1】:

Andreas 解决方案的另一个替代方案是使用 CM_MOUSELEAVE VCL 消息,该消息已在 delphi 7 中定义。

使用 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;

【讨论】:

  • 如果自定义控件位于窗体的最边缘,并且鼠标离开控件和窗体而根本不在窗体上方,这是否有效?
  • @Andreas 我认为,这将在那种情况下起作用,实际上这种方式与现代版本的 Delphi 实现此事件的方式非常相似。
  • @RRUZ:我基本上在 Windows 95 上的 Delphi 4 上尝试了这个,使用 TImage(图形控件),但它在“表单边缘”不起作用。
【解决方案2】:

当鼠标离开控件时,您可以告诉 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 在创建消息时会删除通知请求,因此您必须在收到消息后重新请求通知。不能在WndProc 中调用SetMouseEvent,因为调用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 事件),我认为这会干扰。

【讨论】:

  • 请帮忙!如何在 Delphi 7 中创建事件?请提供示例或源代码
  • @Robrok: How to create an event,昨天问过。
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 2013-11-11
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多