2011-10-18 3 views
4

Windowsフォームに「マウス離脱」イベントを設定しました。マウスが表示された領域を離れるときにフォームを非表示にしたいとします。マウスフォームをWindowsフォームに残す

ここで私は問題に直面しています。同じフォームのボタンにマウスを移動しても、マウスの離脱イベントが呼び出され、このフォームが見えなくなります。

これは、マウスをボタンに移動するときにイベントトリガを防止する必要があることを意味します。しかしどうですか? 他の方法はありますか?

+1

(例えばドッキングされた)。 MusiGenesisが示唆しているようにMouseMoveイベントを使用する場合は、それに注意してください。 –

+2

これを行うためのきれいな方法はありません。タイマーが必要です。 this.Bounds.Contains(Cursor.Position)がfalseのときにフォームを非表示にします。もう一度表示するフォームを取得することはかなり難しいだろう:) –

答えて

1

簡単な方法はありません。 1つの方法は、フォーム内のすべてのコントロールをチェックすることができます。マウスがそれらの上にない場合は、マウスがフォーム外にあることを意味します。

もう一つの方法は、マウスがウィンドウの境界内にあるかどうかない

+0

それはあまりにも多くの労力がかかります。ではない? –

+0

はい、私が言ったように、それを行う簡単な方法はありません。最初のオプションは、フォーム内に少数のコントロールがある場合に使用できます。それ以外の場合は2番目のオプションに移動します。 –

+0

コントロールのプロパティ(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); 
    } 
} 
フォーム上のマウスイベントに問題がフォーム全体のクライアント領域をカバーする任意のコントロールを持っている場合は、それらのどれも発火しないということです
関連する問題