我在窗體窗體上設置了「鼠標離開」事件,並且當鼠標離開可見區域時我想隱藏窗體。Windows窗體上的鼠標離開事件
但這裏是我面臨問題的地方。即使當我將鼠標移動到同一表單上的按鈕時,它也會調用「鼠標離開」事件,這會使該表單不可見。
這意味着我必須在將鼠標移動到按鈕時防止事件觸發。但是如何? 任何其他方法?
我在窗體窗體上設置了「鼠標離開」事件,並且當鼠標離開可見區域時我想隱藏窗體。Windows窗體上的鼠標離開事件
但這裏是我面臨問題的地方。即使當我將鼠標移動到同一表單上的按鈕時,它也會調用「鼠標離開」事件,這會使該表單不可見。
這意味着我必須在將鼠標移動到按鈕時防止事件觸發。但是如何? 任何其他方法?
有沒有簡單的方法來做到這一點。一種方法可能是檢查窗體內的所有控件,如果鼠標不在窗體的任何一邊,這意味着鼠標不在窗體內
另一種方法是檢查鼠標是否在窗口邊界內或不
這將花費太多精力。不是嗎? –
是的,正如我所說沒有簡單的方法來做到這一點。如果Form中有少量控件,則可以使用第一個選項,否則請執行第二個選項 –
可以通過Controls屬性(http://msdn.microsoft.com/en-us/library)訪問所有控件和子控件/system.windows.forms.control.controls.aspx)。如果表單不是太大/複雜,則可以在每個MouseLeave上移動此控制樹。 – bitbonk
// 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();
}
這是非常簡單的...補充一點:
protected override void OnMouseLeave(EventArgs e)
{
if(this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
return;
else
{
base.OnMouseLeave(e);
}
}
與形式的鼠標事件的問題是,如果你有覆蓋整個窗體的客戶區的任何控制他們沒有將火(例如停靠)。因此,如果您使用MusiGenesis建議的MouseMove事件,請注意這一點。 –
有沒有乾淨的方式來做到這一點,你需要一個計時器。當this.Bounds.Contains(Cursor.Position)爲false時隱藏表單。讓表單再次顯示將會非常困難:) –