c# - 窗体上的 Mouseenter 和 Mouseleave

标签 c# .net winforms

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

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

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

最佳答案

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

(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中的if语句做成一个扩展方法,有利于进一步的使用。

关于c# - 窗体上的 Mouseenter 和 Mouseleave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170602/

相关文章:

c# - 编译错误 :index out of range

c# - 具有默认列名的sql server CLR标量函数

c# - 解决方案之间的记录错误

.net - 如何使 .NET 应用程序看起来像 Windows 8ish

c# - 添加行时保持 TextBox 滚动位置

c# - 是否可以向部分类中的属性添加属性?

c# - 打印出整个数据 GridView 的简单方法

c# - 我想将 XML Like 字符串拆分为 c# 或 sql 中的标记

c# - 运行 BenchmarkDotNet 时为 "Wrong assembly binding redirects"

java - 从使用 .net 编写的文件中读取字符