Windows フォームに 'mouse leave' イベントを設定しました。マウスが表示領域を離れたときにフォームを非表示にしたいと考えています。
しかし、ここで私は問題に直面しています。マウスを同じフォームのボタンに移動しても、「マウスを離す」イベントが呼び出され、このフォームが非表示になります。
これは、マウスをボタンに移動したときにイベントがトリガーされないようにする必要があることを意味します。しかし、どのように?他のアプローチはありますか?
Windows フォームに 'mouse leave' イベントを設定しました。マウスが表示領域を離れたときにフォームを非表示にしたいと考えています。
しかし、ここで私は問題に直面しています。マウスを同じフォームのボタンに移動しても、「マウスを離す」イベントが呼び出され、このフォームが非表示になります。
これは、マウスをボタンに移動したときにイベントがトリガーされないようにする必要があることを意味します。しかし、どのように?他のアプローチはありますか?
それを行う簡単な方法はありません。1 つの方法は、フォーム内のすべてのコントロールをチェックすることです。マウスがそれらのいずれにもない場合、これはマウスがフォームの外にあることを意味します。
もう1つの方法は、マウスがウィンドウ境界内にあるかどうかにかかわらず、マウスのLeaveイベント内をチェックすることです
// 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 (var 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);
}
}