我有一个带有子控件的表单。 我想当用户将鼠标移到表单上时,表单将被关闭。 所以我抓住鼠标进入并在表格上离开。但是如果我在窗体中的任何控件上移动鼠标,鼠标离开事件也会被捕获。
请帮我解决这个问题。感谢。
更新 当光标的位置在表单的标题区域上时(该区域称为非客户区域)。我将鼠标移出此区域,我无法收到WM_MOUSELEAVE消息以及WM_NCMOUSELEAVE。请帮我解决这个问题。我希望在将鼠标移出此区域时收到消息。感谢。
答案 0 :(得分:1)
基本上你想检查光标是否在控件的范围内。这是解决方案:
(1)在与Panel
大小相同的表单中添加Form
,然后将表单中的所有控件移到面板中。它很容易更改:打开MyForm.designer.cs
,添加面板,并将this.Controls.Add(myLabel);
等所有语句更改为this.myPanel.Controls.Add(myLabel);
。
(2)处理您添加的面板的MouseEnter
和MouseLeave
个事件。
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;