事件冒泡 - 子控件的Mousehover事件

时间:2011-04-13 21:17:08

标签: c# winforms events

我有一个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;
}

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

我错过了什么?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我这样做了一次这样的技巧,以密切关注所有形式的祖先:

表单包含 ControlAdded 事件。您可以将自己挂钩(可能在 InitializeForm 之前。在该事件处理程序内部可以将自己挂钩到所有子项和孙子 ControlAdded和MouseXXX 事件中你可以将同一类型的所有事件发送到同一个处理程序。

使用这种方法,我认为最简单的解决方案是观察所有祖先的 MouseLeave和MouseEnter 事件,然后检查鼠标光标位置以查看它是否在窗体的屏幕矩形中(当您的鼠标在表单周围移动时,您的事件处理程序将被捣碎,其中的事件将被触发。无论如何,那么你将用零定时器解决它!