鼠标输入&鼠标离开表格

时间:2010-11-13 02:22:51

标签: c# .net winforms

我有一个带有子控件的表单。 我想当用户将鼠标移到表单上时,表单将被关闭。 所以我抓住鼠标进入并在表格上离开。但是如果我在窗体中的任何控件上移动鼠标,鼠标离开事件也会被捕获。

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

更新 当光标的位置在表单的标题区域上时(该区域称为非客户区域)。我将鼠标移出此区域,我无法收到WM_MOUSELEAVE消息以及WM_NCMOUSELEAVE。请帮我解决这个问题。我希望在将鼠标移出此区域时收到消息。感谢。

2 个答案:

答案 0 :(得分:1)

基本上你想检查光标是否在控件的范围内。这是解决方案:

(1)在与Panel大小相同的表单中添加Form,然后将表单中的所有控件移到面板中。它很容易更改:打开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步中的if语句转换为扩展方法,这有助于更进一步的使用。

答案 1 :(得分:0)

这种情况正在发生,因为您的子控件在离开控件时会有间隙自动触发form_mouseEnter事件

你可以采取一种方式来放置没有间隙的控件

如果您不希望用户离开您的控件,您可以设置光标边界 使用这个

Cursor.Clip=Control_name.Bounds;