2010-11-13 57 views
4

我有一个带有子控件的窗体。 我想要当用户将鼠标移到窗体上时,窗体将被关闭。 因此,我赶上鼠标进入并在窗体上移动。但是如果我将鼠标移到窗体中的任何控件上,鼠标离开事件也会被捕获。Mouse Enter&Mouse Leave on a form

请帮我解决这个问题。谢谢。

更新: 当光标的位置位于窗体的标题区域(该区域称为非客户区域)时。我将鼠标移出该区域,我无法收到WM_MOUSELEAVE消息以及WM_NCMOUSELEAVE。请帮我解决这个问题。将鼠标移出该区域时我想收到一条消息。谢谢。

+1

的可能重复【如何当鼠标离开的形式检测?](http://stackoverflow.com/questions/279472/how-to-detect-when-the-mouse-leaves-the-form) – 2010-11-13 08:39:01

回答

1

从本质上讲,你要检查如果光标在控制的范围内。解决方案如下:

(1)在与您的Form大小相同的表单中添加Panel,并将表单中的所有控件移动到面板。很容易更改:打开MyForm.designer.cs,添加面板,并将所有语句(如this.Controls.Add(myLabel);)更改为this.myPanel.Controls.Add(myLabel);

(2)处理您添加的面板的MouseEnterMouseLeave事件。

myPanel.MouseEnter += (sender, e) => 
{ 
    //enter 
}; 

myPanel.MouseLeave += (sender, e) => 
{ 
    if (Cursor.Position.X < myPanel.Location.X 
     || Cursor.Position.Y < myPanel.Location.Y 
     || Cursor.Position.X > myPanel.Location.X + myPanel.Width 
     || Cursor.Position.Y > myPanel.Location.Y + myPanel.Height) 
    { 
     //out of scope 
    } 
}; 

(3)为什么不在步骤2中使用Form?为什么我们需要一个尺寸相同的Panel?亲自尝试一下。表单的边框会让你发疯。

(4)可以使在步骤2中的扩展方法,该方法是有帮助的furthur用法if语句。

0

这种情况正在发生,因为你必须从控制自动离开form_mouseEnter事件触发

的方式,你可以不喜欢把控制无间隙的子控件之间的差距

如果您不想让用户离开你的控制你可以设置光标的边界 使用这个

Cursor.Clip=Control_name.Bounds;