控制隐藏事件';C#Windows程序中的窗体

控制隐藏事件';C#Windows程序中的窗体,c#,C#,我已经为我的表单编写了MouseMove的事件处理程序 但当我向窗体添加面板时,当鼠标在面板上移动时,该处理程序不会运行。 我在面板中添加了事件处理程序,这很有效,但表单上有几个面板, 有更简单的解决方案吗?没有更简单的方法,您应该为需要接收MouseMove事件的每个控件分配事件处理程序。没有更简单的方法,您应该为需要接收MouseMove事件的每个控件分配事件处理程序。我认为您应该能够“传播”处理程序,因此不必在每个处理程序中重新编写代码。请记住,MouseMove事件具有控制相对坐标,因此

我已经为我的表单编写了MouseMove的事件处理程序 但当我向窗体添加面板时,当鼠标在面板上移动时,该处理程序不会运行。 我在面板中添加了事件处理程序,这很有效,但表单上有几个面板,
有更简单的解决方案吗?

没有更简单的方法,您应该为需要接收MouseMove事件的每个控件分配事件处理程序。

没有更简单的方法,您应该为需要接收MouseMove事件的每个控件分配事件处理程序。

我认为您应该能够“传播”处理程序,因此不必在每个处理程序中重新编写代码。请记住,MouseMove事件具有控制相对坐标,因此如果您将事件从面板传递到窗体,则必须将事件中的X&Y值转换为窗体坐标(类似于从event.X中减去panel.location.X等)。

我认为您应该能够“传播”处理程序,因此,您不必在每个代码中重新编写代码。请记住MouseMove事件具有控制相对坐标,因此,如果将事件从面板传递到窗体,则必须将事件中的X&Y值转换为窗体坐标(类似于从event.X中减去panel.location.X等)。

如果将窗体的属性设置为true,它将接收所有鼠标输入,无论鼠标下的控件是什么。在某些操作中,它将丢失鼠标捕获(但我不确定确切的时间)。此外,根据该属性的文档,在捕获鼠标时快捷键不应起作用。因此,根据您想要实现的目标,这可能不是首选方法。

如果您将窗体的属性设置为true,则它将接收所有鼠标输入,而不管鼠标下是哪个控件。在某些操作中,它将丢失鼠标捕获(但我不确定确切的时间)。此外,根据该属性的文档,在捕获鼠标时快捷键不应起作用。因此,根据您想要实现的目标,这可能不是首选方法。

不幸的是,WinForms不支持事件冒泡。但是您可以编写一些代码来简化连接事件的任务

public void AssignMouseMoveEvent(Form form)
{
    foreach(Control control in form.Controls)
    {
        if(! (control is Panel))
            continue;

        control.MouseMove += PanelMouseMove;
    }
}

您应该调用上面的代码,并将其传递到当前窗体,它将为所有面板的MouseMove事件指定PanelMouseMove作为事件处理程序。

不幸的是,WinForms不支持事件冒泡。但是您可以编写一些代码来简化连接事件的任务

public void AssignMouseMoveEvent(Form form)
{
    foreach(Control control in form.Controls)
    {
        if(! (control is Panel))
            continue;

        control.MouseMove += PanelMouseMove;
    }
}

您应该调用上面的代码,并将其传递到当前窗体,它将指定PanelMouseMove作为所有面板的MouseMove事件的事件处理程序。

假设鼠标开始在窗体上移动,而不是在面板上移动(这是一个很大的假设),当鼠标进入子控件时,您将得到一个MouseLeave事件。您可以检查光标位置并调用鼠标移动代码(如果它仍在表单的边界内)


如果鼠标移动事件在控件上启动,则此操作无效。

假设鼠标开始在窗体上移动,而不是在面板上移动-这是一个很大的假设-当鼠标进入子控件时,您将得到一个MouseLeave事件。您可以检查光标位置并调用鼠标移动代码(如果它仍在表单的边界内)

如果鼠标移动事件在控件上启动,则此操作无效。

此代码适用于我(假设您有一个带有面板和标签的窗体。标签名为“MouseCoords”

这段代码适用于我(假设您有一个带有面板和标签的表单。标签名为“MouseCoords”


您可以实现IMessageFilter来预处理发送到控件的消息


但是,我认为从设计角度来看,这不是一种非常干净的方法。

您可以实现IMessageFilter来预处理发送到控件的消息

但是,我认为从设计角度来看,这不是一种非常干净的方法。

我找到了另一种解决方案:)“在隐藏事件的控件中引发事件” 我在面板中捕获事件,并通过调用onMouseMove来引发窗体的鼠标移动事件。我找到了另一个解决方案:)“在隐藏事件的控件中引发事件”
我在面板中捕获事件,并通过调用onMouseMove来提升窗体的鼠标移动事件

捕获主要保留用于拖动操作,因为在这种情况下,所有其他控件都会失去鼠标互操作性。捕获主要保留用于拖动操作,因为在这种情况下,所有其他控件都会失去鼠标互操作性。请注意,PanelMouseMove事件处理程序中的e.Location将与引发MouseMove事件的控件相对。我认为这是作者需要的,不是吗?鉴于作者希望表单获得所有鼠标输入,我可以想象,如果坐标是相对于窗体的,而不是相对于鼠标恰好移动的控件的,那么这将是更好的选择。只需打几个电话到ClientToScreen和ScreenToClient即可轻松修复。只是想让作者意识到这一点。只是要意识到PanelMouseMove事件处理程序中的e.Location将与引发MouseMove事件的控件相对。我认为这是作者需要的,不是吗?鉴于作者希望表单获得所有鼠标输入,我可以想象,如果坐标是相对于窗体的,而不是相对于鼠标恰好移动的控件的,那么这将是更好的选择。只需打几个电话到ClientToScreen和ScreenToClient即可轻松修复。只是想让作者意识到这一点。我对这项技术很熟悉。但是,当我们将同一个处理程序分配给多个控件时,对性能的影响是什么呢