2011-04-13 67 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事件,然後檢查鼠標光標位置,看它是否在窗體的屏幕矩形(你的事件處理程序當你的鼠標在表單中移動時,會被滿滿的事件觸發)無論如何,那麼你就可以用零定時器來解決它!