【问题标题】:Mouse Leave event in Firemonkey 10.3Firemonkey 10.3 中的鼠标离开事件
【发布时间】:2019-12-21 09:48:41
【问题描述】:

我有一个带有控件 (myControl) 和子控件 (myChildControl) 的表单。

我想管理 myControl 上的鼠标退出,以便我可以采取一些行动。

问题是 On Mouse Leave 事件被触发,即使鼠标仍然在 myControls 内但越过了 myChildControl,而在这种情况下我不需要触发该事件。

我无法在子控件中设置 HitTest 属性,因为我还需要对其上的鼠标事件执行一些操作。

从概念上讲,Mouse Leave 事件可以正常触发,但管理这种情况的最简洁的方法是什么?

【问题讨论】:

  • 顺便说一句,我从你的标题中删除了 XE。 XE 品牌在版本 10 中被删除。
  • 当鼠标悬停在您的子控件上时,您可能会通过触发子控件的OnMouseEnter 来保持所需状态,这取决于您的事件。
  • @SilverWarior 尝试过已经导致我在这些事件中隐藏/显示的控件闪烁。

标签: delphi firemonkey delphi-10.3-rio


【解决方案1】:

为子控件设置HitTest = False。然后在父控件的OnMouseDown中,使用PtInRect()来检查鼠标按下事件是否发生在子控件上。

如果需要,您也可以对其他鼠标事件执行相同操作。


编辑在评论几个子控件之后。

我不太同意你关于混乱的看法。以下示例用于在父控件(本示例中为 TPanel)上可能需要响应鼠标按下事件的任意数量的子控件。为最终的其他事件添加最后两行并不是什么大问题,IMO。

procedure TForm20.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  ctrl: TControl;
begin
  for ctrl in (Sender as TControl).Controls do
    if PtInRect(ctrl.ParentedRect, PointF(X, Y)) then
      if assigned(ctrl.OnMouseDown) then
        ctrl.OnMouseDown(ctrl, Button, Shift, x-ctrl.Position.X, y-ctrl.Position.Y);
end;

完全不同的方法是使用父控件所在控件的OnMouseEnter 事件(或者如果放置在没有OnMouseEnter 的表单上,则使用OnMouseMove) , 以触发 OnExit 替代。由于这可能会经常触发,因此您可以通过为 ActionRequired 声明一个布尔值来避免不必要的操作

【讨论】:

  • 这对我不起作用,因为儿童控件不止一个具有不同的行为,它会变得混乱。我更多地考虑捕获鼠标位置并意识到它是否在 myControl 矩形内。虽然找不到任何合适的代码支持这一点。
猜你喜欢
  • 2011-12-10
  • 2013-11-11
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多