【问题标题】:Mouse Enter & Mouse Leave on a form表单上的 Mouseenter 和 Mouseleave
【发布时间】:2010-11-13 02:22:50
【问题描述】:

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

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

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

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    一种您可以做到的方式,例如无间隙放置控件

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

    Cursor.Clip=Control_name.Bounds;
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多