Winform-マウスがユーザーコントロールを離れたかどうかを判断します

StackOverflow https://stackoverflow.com/questions/423728

質問

私は簡単にできると思うものに苦労しています。 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イベントをそれらに追加することもできます。

マウスがコントロールまたは子コントロールにある場合は、簿記を行う必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top