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事件附加到它们。
如果鼠标在您的控制中,或者某些儿童控制,您必须做一些簿记。