4

簡単にできるはずの何かに苦労しています(っぽい)。フォームの下部にウィンドウ フォームとフローグリッド レイアウト パネルがあります。このフォーム内に、X 個のユーザー コントロールを動的に入力します。コントロールはすべて同じタイプです。

目標は、ユーザーがユーザー コントロールの上にマウスを移動すると、別のフォームが開き、マウスがある場所に配置されることです。マウスがフォームから離れると、開いているフォームが消えます。

これはほとんどうまくいきます。問題は、ユーザー コントロールにラベルやテキスト ボックスのようなものが含まれている場合です。UC を離れたと見なされるため、フォームは消えます。

私の考えは、X と Y を使用して UC 内にあるかどうかを判断することでしたが、これを理解することはできません。

質問してもいいですか:

1) これに対する最善のアプローチは何ですか? 2)UCは動的であるため、どのようにコーディングできますか。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 値を持つことができる方法がわかりません。

4

4 に答える 4

4

すべてのコントロールの 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();
    }
  }
于 2009-01-08T18:42:02.780 に答える
0

アイデア1)MouseLeaveイベントが発生すると、マウス座標(画面に対して)を確認し、それらがまだユーザーコントロールの境界内にあるかどうかを確認できます。そうである場合、マウスがコントロールを通過して境界の外に出る必要があると想定する必要があり、今回はイベントを安全に無視できます。

アイデア 2)MouseEnterイベント ハンドラーを子コントロールにアタッチします。MouseLeave次に、マウスが入ると、ユーザーコントロールのイベントを認識して無視できます。次に、子のMouseLeaveイベントが発生したら、ユーザーコントロールをMouseEnterもう一度確認します。

于 2009-01-08T09:50:35.707 に答える
0

MouseLeaveあなたが持っているすべてのコントロールにイベントハンドラーを追加し、Parentプロパティを使用して目的のユーザーコントロールを見つけると思います。同意しますが、少し痛いでしょう。

于 2009-01-08T09:58:06.330 に答える
0

コントロールのすべての子コントロール (再帰的) をループして、MouseEnter および MouseLeave イベントをそれらにアタッチすることもできます。

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

于 2009-01-08T10:02:44.310 に答える