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

我正在努力做一些我认为应该很容易的事情(ish)。 我有一个窗体和窗体底部的flowgridlayout面板。 在此表单中,我使用X个用户控件动态填充它。 控件都是相同的类型。

目标是当用户将鼠标hover在用户控件上时,它会打开另一个表单并将其定位在鼠标所在的位置。 当鼠标离开表格时,打开的表格消失。

这几乎很有效。 问题是当用户控件中有标签或文本框之类的东西时。 它被认为已离开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值。

挂钩所有控件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事件处理程序附加到子控件。 然后,当鼠标进入一个时,您将知道并可以忽略usercontrol的MouseLeave事件。 然后当孩子的MouseLeave事件触发时,再次检查usercontrol的MouseEnter

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

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

如果鼠标在您的控制中,或者某些儿童控制,您必须做一些簿记。