事件冒泡 - 子控件的鼠标悬停事件

3
我有一个包含一些控件的winform窗体。
当光标进入窗体(包括窗体内容)时,我想触发特定任务。
当光标离开窗体时,我想触发另一个任务。
显然,在窗体上设置这些事件是行不通的:(例如,当我从窗体本身移动到其他控件时,会触发MouseLeave)。
this.MouseEnter += (sender, e) =>
{
   //do stuff
};

this.MouseLeave += (sender, e) =>
{
   //do stuff
};

我也尝试过使用类似问题中出现的 IMessageFilter 接口,但是没有给我所需的结果!问题在于检测鼠标何时完全离开窗体。
 public bool PreFilterMessage(ref Message m)
 {
    switch (m.Msg)
    {
        case WM_MOUSEMOVE: //or other messages
        bool z = myForm.Bounds.Contains(Cursor.Position); //This didn't help
    }
    eturn false;
}

在表单内容中(当我在控件之间移动时),也存在检测问题。

我错过了什么?

更新:我不想使用计时器!


你可能需要使用一个计时器来判断你是否仍然在表单的范围内。这个问题之前已经被问过了这里 - Ross Anderson
我不想使用任何计时器。 - Mark A
@Hans Passant,这是唯一的方法吗? - Mark A
2个回答

0
您可以获取指针的当前x,y坐标,并查看它们是否在表单内。如果不在,则执行离开表单的任务。

0

我曾经使用过以下技巧来跟踪所有表单的祖先:

表单有一个ControlAdded事件。您可以在其中挂钩(可能是在InitializeForm之前)。在此事件处理程序中,可以将自己挂钩到所有子代和孙代的ControlAdded和MouseXXX事件上。您可以将所有同一类型的事件发送到同一个处理程序。

采用这种方法,我想最简单的解决方案将是监视所有祖先的MouseLeave和MouseEnter事件,然后检查鼠标光标位置,以查看其是否在表单的屏幕矩形内(当鼠标在表单上移动时,您的事件处理程序将充满触发的事件)。无论如何,然后您就可以零计时器地解决问题了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接