Winform - 确定鼠标是否已离开用户控件

时间:2009-01-08 09:48:03

标签: c# winforms user-controls mouse

我正在努力做一些我认为应该很容易的事情(ish)。我有一个窗体和窗体底部的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 Width = 62 Height = 29} System.Drawing.Rectangle

我不明白p2(它的父级)相对于屏幕的Y值是多少。

4 个答案:

答案 0 :(得分: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();
    }
  }

答案 1 :(得分:0)

创意1)当MouseLeave事件触发时,您可以检查鼠标坐标(相对于屏幕)并检查它们是否仍在您的用户控件的范围内。如果是,则应该假设鼠标必须通过控件返回到界外,并且这次可以安全地忽略该事件。

创意2)将MouseEnter事件处理程序附加到子控件。然后,当鼠标进入一个时,您将知道并可以忽略usercontrol的MouseLeave事件。然后当孩子的MouseLeave事件触发时,再次检查用户控件的MouseEnter

答案 2 :(得分:0)

我想我会为你拥有的每个控件添加MouseLeave的事件处理程序,并使用Parent属性来查找你所使用的用户控件。我同意,但这会有点痛苦。

答案 3 :(得分:0)

您还可以遍历控件上的所有子控件(递归),并将MouseEnter和MouseLeave事件附加到它们。

如果鼠标在你的控制范围内,或者有一些儿童控制,你必须做一些簿记。