获取不同控件的鼠标位置

本文关键字:鼠标 位置 控件 获取 | 更新日期: 2023-09-27 18:18:28

在另一个面板(panel1)中有一个面板(panel2)。我想获得panel1的鼠标位置,但是当我将鼠标移动到panel2上时,下面的代码停止工作。

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        label1.Text = "Offset: " + e.X + " x " + e.Y;
    }

如何让它读取鼠标参数,即使鼠标在panel2上?谢谢!

编辑:panel2位于panel1的中心x=100, y=100。如果我把鼠标移到panel2的左上角它会给出坐标,比如1x1,我需要在panel1上定位101x101

编辑2:我没有试图拖动它,只是读取原始面板(panel1)的坐标,所以我可以计算缩放panel2的偏移量。所以我只需要鼠标移动,不需要别的。由于

获取不同控件的鼠标位置

如果您只需要在按住鼠标按钮时执行此操作(例如,因为您正在跟踪拖放操作或选择),则可以执行以下操作:

    在你的MouseDown处理程序中,调用this.Capture = true;
  1. 现在你的鼠标移动处理程序将接收鼠标移动消息,即使鼠标在另一个控件上。
  2. 在你的MouseUp处理程序中,调用this.Capture = false; -注意:如果你忘记这样做,你在同一进程中的其他控件将不会收到任何鼠标消息。

除此之外,如果不向其他控件添加鼠标处理程序,从其他控件获取MouseMove消息是非常棘手的。

关于this.Capture的主要事情是,你需要一个很好的时间将其设置为真,另一个很好的时间将其设置为假。一般来说,这是在MouseDown和MouseUp中完成的,正如我所描述的。

但是,您也可以将这些坐标从Panel2-relative转换为Panel1-relative,如下所示:

从Panel2坐标转换为屏幕坐标:

Point screenCoords = panel2.PointToScreen(mouseCoordInPanel2);

然后从屏幕坐标转换为panel1相对坐标:

Point mouseCoordInPanel1 = panel1.PointToClient(screenCoords);

要做到这一点,你必须在Panel2中有一个MouseMove处理程序,在那里你做了这个转换,Panel2需要一个对Panel1的引用,以便调用panel1.PointToClient()

您还必须分配给另一个面板的事件

你能不能把事件处理程序放在panel2中,然后使用panel1和panel2的左/顶属性来偏移panel2中的鼠标位置,以在panel1中获得你想要的位置?

我还认为将事件分配给第二个面板将是最好的事情。当鼠标在面板1上时,将直接提供坐标;当它在面板2上时,它们将通过计算两个面板之间的相对位置进行转换(非常简单:X/Y位置的变化;不需要硬编码但在运行时更新的值)