2009-01-08 81 views
4

我正在努力应对(ish)。我在窗体底部有一个窗体和一个flowgridlayout面板。在这个表单里面,我用X个用户控件动态地填充它。这些控件都是相同的类型。Winform - 确定鼠标是否已经离开用户控制

目标是当用户将鼠标移到用户控件上时,它会打开另一个窗体并将其放置在鼠标所在的位置。当鼠标离开窗体时,打开的窗体消失。

这几乎很好。问题出在用户控件的内部有类似标签或文本框的情况。它被认为已经离开了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
  • 毫秒{X = 574 Y = 914} System.Drawing中。 Point
  • screenBounds {X = 808 Y = 908宽度= 62高度= 29} System.Drawing.Rectangle

我不明白如何p2(其父)可以有一个更大的Y值相对于屏幕。

回答

3

挂接所有控件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(); 
    } 
    } 
+0

嗨nobugz,我认为这将工作,如果鼠标是弹出窗体内,但鼠标引用是在用户控件。窗体靠近它,但不在顶部,所以鼠标不会进入该窗体。所以我不相信我可以使用DesktopBounds。 – Jon 2009-01-09 11:33:20

0

想法1)当MouseLeave事件触发时,您可以检查鼠标坐标(相对于屏幕),并检查它们是否仍在用户控件的范围内。如果是的话,应该假设鼠标必须通过控制回到界限之外,这次你可以放心地忽略这个事件。

想法2)将MouseEnter事件处理程序附加到子控件。然后当鼠标进入时,你会知道并可以忽略usercontrol的MouseLeave事件。然后,当孩子的MouseLeave事件触发时,请再次检查usercontrol的MouseEnter

+0

我有一个去这个,并失败悲惨..我相信这是可能的,但我无法让我的界限工作。如果有人可以提供一个将会是光明的例子! 谢谢 – Jon 2009-01-08 10:10:12

0

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

0

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

如果鼠标在您的控制中或某个孩子的控制下,您必须进行一些记录。