我有一个带有子控件的表单。 我希望当用户将鼠标移到表单上时,表单将关闭。 所以我捕获鼠标进入并在表格上移动离开。但是如果我在窗体中的任何控件上移动鼠标,鼠标离开事件也会被捕获。
请帮我解决这个问题。谢谢。
更新: 当光标的位置在窗体的标题区域时(该区域称为非客户区)。我将鼠标移出该区域,我无法接收 WM_MOUSELEAVE 消息以及 WM_NCMOUSELEAVE。请帮我解决这个问题。将鼠标移出该区域时,我想收到一条消息。谢谢。
最佳答案
本质上你想检查光标是否在控件的范围内。这是解决方案:
(1) 在窗体中添加一个与你的Form
大小相同的Panel
,并将窗体中的所有控件移动到面板中。更改很容易:打开 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
语句做成一个扩展方法,有利于进一步的使用。
关于c# - 窗体上的 Mouseenter 和 Mouseleave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170602/