表单上的鼠标进入和离开事件

4
我有一个包含子控件的表单。 我希望当用户将鼠标移动到表单上时,表单会关闭。 因此我在表单上捕获鼠标进入和移动离开事件。但是如果我将鼠标移动到表单中的任何控件上,鼠标离开事件也会被捕获。
请帮助我解决这个问题。谢谢。
更新: 当鼠标指针位于表单标题区域(该区域称为非客户端区域)时,我将鼠标移出该区域,无法接收到WM_MOUSELEAVE消息以及WM_NCMOUSELEAVE消息。请在此问题上帮助我。我希望在移出此区域时能够接收到一条消息。谢谢。

1
可能是重复的问题:如何检测鼠标何时离开表单? - Hans Passant
2个回答

2

本质上你需要检查光标是否在控件的范围内。以下是解决方案:

(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) 为什么第二步不使用 Form?为什么需要一个相同大小的 Panel?你可以自己试试。表单的窄边框会让你发疯。

(4) 你可以将第二步中的 if 语句转换为扩展方法,这有助于进一步使用。


0

这是因为您的子控件之间存在间隙,当离开控件时,form_mouseEnter事件会自动触发。

一种解决方法是将控件放置在没有间隙的位置。

或者

如果您不希望用户离开您的控件,可以设置光标的边界,使用以下代码:

Cursor.Clip=Control_name.Bounds;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接