2011-10-18 60 views
4

我在窗體窗體上設置了「鼠標離開」事件,並且當鼠標離開可見區域時我想隱藏窗體。Windows窗體上的鼠標離開事件

但這裏是我面臨問題的地方。即使當我將鼠標移動到同一表單上的按鈕時,它也會調用「鼠標離開」事件,這會使該表單不可見。

這意味着我必須在將鼠標移動到按鈕時防止事件觸發。但是如何? 任何其他方法?

+1

與形式的鼠標事件的問題是,如果你有覆蓋整個窗體的客戶區的任何控制他們沒有將火(例如停靠)。因此,如果您使用MusiGenesis建議的MouseMove事件,請注意這一點。 –

+2

有沒有乾淨的方式來做到這一點,你需要一個計時器。當this.Bounds.Contains(Cursor.Position)爲false時隱藏表單。讓表單再次顯示將會非常困難:) –

回答

1

有沒有簡單的方法來做到這一點。一種方法可能是檢查窗體內的所有控件,如果鼠標不在窗體的任何一邊,這意味着鼠標不在窗體內

另一種方法是檢查鼠標是否在窗口邊界內或不

+0

這將花費太多精力。不是嗎? –

+0

是的,正如我所說沒有簡單的方法來做到這一點。如果Form中有少量控件,則可以使用第一個選項,否則請執行第二個選項 –

+0

可以通過Controls屬性(http://msdn.microsoft.com/en-us/library)訪問所有控件和子控件/system.windows.forms.control.controls.aspx)。如果表單不是太大/複雜,則可以在每個MouseLeave上移動此控制樹。 – bitbonk

1
// On the form's MouseLeave event, please checking for mouse position is not in each control's client area. 
    private void TheForm_MouseLeave(object sender, EventArgs e) 
    { 
     bool mouse_on_control = false; 
     foreach (Control c in Controls) 
      mouse_on_control |= c.RectangleToScreen(c.ClientRectangle).Contains(Cursor.Position); 
     if (!mouse_on_control) 
      Close(); 
    } 

// And in addition, if any control inside has its client area overlapping the form's client area at any border, 
// please also checking if mouse position is outside the form's client area on the control's MouseLeave event. 
    private void ControlOverlappedTheFormsBorder_MouseLeave(object sender, EventArgs e) 
    { 
     if (!RectangleToScreen(ClientRectangle).Contains(Cursor.Position)) 
      Close(); 
    } 
0

這是非常簡單的...補充一點:

protected override void OnMouseLeave(EventArgs e) 
{ 

    if(this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) 
     return; 
    else 
    { 
     base.OnMouseLeave(e); 
    } 
}