Winform-マウスがユーザーコントロールを離れたかどうかを判断します
-
05-07-2019 - |
質問
私は簡単にできると思うものに苦労しています。 Windowsフォームと、フォームの下部にflowgridlayoutパネルがあります。このフォーム内で、X個のユーザーコントロールを動的に入力します。コントロールはすべて同じタイプです。
目標は、ユーザーがユーザーコントロールの上にマウスを移動し、別のフォームを開いてマウスがある場所に配置することです。マウスがフォームを離れると、開いたフォームは消えます。
これはほとんどうまくいきます。問題は、ユーザーコントロールの内部にラベルやテキストボックスなどがある場合です。 UCを離れたと見なされ、フォームが消えます。
XとYを使用してUC内にあるかどうかを判断することを考えていましたが、これを理解することはできません。
尋ねることができます:
1)これに対する最善のアプローチは何ですか? 2)UCは動的であるため、どのようにコーディングすればよいのかを正確に知ることはできません。
ありがとう
編集
マウスポインターを把握しようとしていますが、そこに到達していません。以下のコードは、UC SmallTagBox_MouseLeaveイベント内にあります。
Point loc = this.Location;
Point p = this.PointToScreen(this.Location);
Point p2 = this.PointToScreen(this.Parent.Location);
Point ms = MousePosition;
Rectangle screenBounds = new Rectangle(this.PointToScreen(this.Location), this.Size);
if (!screenBounds.Contains(ms))
{
thw.Close();
thw = null;
}
- loc {X = 275 Y = 3} System.Drawing.Point
- p {X = 808 Y = 908} System.Drawing.Point
- p {X = 808 Y = 908} System.Drawing.Point
- p2 {X = 545 Y = 1542} System.Drawing.Point
- ms {X = 574 Y = 914} System.Drawing.Point
- screenBounds {X = 808 Y = 908幅= 62高さ= 29} System.Drawing.Rectangle
私は、p2(その親)が画面に対してより大きなY値を持つことができる方法を理解していません。
解決
すべてのコントロールのMouseEnterイベントとMouseLeaveイベントをフックし、それがまだフォーム内にあるかどうかを判断するのは非常に苦痛です。簡単なタイマーで仕事をすることもできます:
public partial class Form1 : Form {
private Timer mTimer;
public Form1() {
InitializeComponent();
mTimer = new Timer();
mTimer.Interval = 200;
mTimer.Tick += mTimer_Tick;
mTimer.Enabled = true;
}
private void mTimer_Tick(object sender, EventArgs e) {
if (!this.DesktopBounds.Contains(Cursor.Position)) this.Close();
}
}
他のヒント
アイデア1) MouseLeave
イベントが発生すると、マウスの座標を(画面に対して)チェックし、それらがまだユーザーコントロールの境界内にあるかどうかを確認できます。そうである場合、境界を越えるためにマウスがコントロールを通過しなければならないと想定する必要があり、今回はイベントを安全に無視できます。
アイデア2) MouseEnter
イベントハンドラーを子コントロールに接続します。その後、マウスがマウスに入ると、ユーザーコントロールの MouseLeave
イベントを認識し、無視できます。次に、子の MouseLeave
イベントが発生したら、ユーザーコントロールの MouseEnter
を再度確認します。
所有するすべてのコントロールに MouseLeave
のイベントハンドラーを追加し、 Parent
プロパティを使用して、目的のユーザーコントロールを見つけると思います。私は同意しますが、少し痛いでしょう。
コントロール上のすべての子コントロール(再帰的)をループし、MouseEnterおよびMouseLeaveイベントをそれらに追加することもできます。
マウスがコントロールまたは子コントロールにある場合は、簿記を行う必要があります。