2010-11-13 74 views
4

我有一個帶有子控件的窗體。 我想要當用戶將鼠標移到窗體上時,窗體將被關閉。 因此,我趕上鼠標進入並在窗體上移動。但是如果我將鼠標移到窗體中的任何控件上,鼠標離開事件也會被捕獲。Mouse Enter&Mouse Leave on a form

請幫我解決這個問題。謝謝。

更新: 當光標的位置位於窗體的標題區域(該區域稱爲非客戶區域)時。我將鼠標移出該區域,我無法收到WM_MOUSELEAVE消息以及WM_NCMOUSELEAVE。請幫我解決這個問題。將鼠標移出該區域時我想收到一條消息。謝謝。

+1

的可能重複【如何當鼠標離開的形式檢測?](http://stackoverflow.com/questions/279472/how-to-detect-when-the-mouse-leaves-the-form) – 2010-11-13 08:39:01

回答

1

從本質上講,你要檢查如果光標在控制的範圍內。解決方案如下:

(1)在與您的Form大小相同的表單中添加Panel,並將表單中的所有控件移動到面板。很容易更改:打開MyForm.designer.cs,添加面板,並將所有語句(如this.Controls.Add(myLabel);)更改爲this.myPanel.Controls.Add(myLabel);

(2)處理您添加的面板的MouseEnterMouseLeave事件。

myPanel.MouseEnter += (sender, e) => 
{ 
    //enter 
}; 

myPanel.MouseLeave += (sender, e) => 
{ 
    if (Cursor.Position.X < myPanel.Location.X 
     || Cursor.Position.Y < myPanel.Location.Y 
     || Cursor.Position.X > myPanel.Location.X + myPanel.Width 
     || Cursor.Position.Y > myPanel.Location.Y + myPanel.Height) 
    { 
     //out of scope 
    } 
}; 

(3)爲什麼不在步驟2中使用Form?爲什麼我們需要一個尺寸相同的Panel?親自嘗試一下。表單的邊框會讓你發瘋。

(4)可以使在步驟2中的擴展方法,該方法是有幫助的furthur用法if語句。

0

這種情況正在發生,因爲你必須從控制自動離開form_mouseEnter事件觸發

的方式,你可以不喜歡把控制無間隙的子控件之間的差距

如果您不想讓用戶離開你的控制你可以設置光標的邊界 使用這個

Cursor.Clip=Control_name.Bounds;