2011-04-13 64 views
3

我有一个WinForm的一些控件。
当光标进入窗体(窗体边界,这包括窗体的内容)时,我想触发特定的任务。 当光标离开窗体时,我想触发另一个任务。事件冒泡 - 儿童控制Mousehover事件

显然seeting的形式,这些事件将无法工作:(因为,例如,当我从形式本身转移到其他控制鼠标离开会引发BW)

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; 
} 

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

我错过了什么?

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

+0

您可能必须使用计时器来确定您是否仍在表单的范围内。此问题已在[此处](http://stackoverflow.com/q/2015101/699423) – 2011-04-13 22:02:19

+0

之前询问过我不想使用任何计时器 – 2011-04-13 22:16:17

+0

您应该使用计时器。 – 2011-04-14 00:01:29

回答

0

您可以获取指针的当前x,y坐标并查看它们是否在表单中。如果他们不是,那么执行非形式任务。

0

我把这样的把戏一次,密切关注各种形式的祖先:

形式有ControlAdded事件。你可以把自己陷入(可能在InitializeForm之前,你可以把所有的事件都发送到同一个处理程序中。

有了这套方法,我想,最简单的解决方案届时将观看所有祖先的鼠标离开和的MouseEnter事件,然后检查鼠标光标位置,看它是否在窗体的屏幕矩形(你的事件处理程序当你的鼠标在表单中移动时,会被满满的事件触发)无论如何,那么你就可以用零定时器来解决它!