4

我正在努力解决我认为应该很容易(ish)的事情。我在窗体底部有一个 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 值。

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事件处理程序附加到子控件。那么当鼠标进入一个时,你就会知道并且可以忽略usercontrol的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 回答