0

我在另一个面板(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的偏移量。所以我只需要鼠标移动,没有别的。谢谢

4

4 回答 4

0

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

于 2013-06-13T14:02:40.103 回答
0

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

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

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

主要的this.Capture是,您需要一个好时机将其设置为 true,然后再将其设置回 false。通常,正如我所描述的,这是在 MouseDown 和 MouseUp 中完成的。

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

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

Point screenCoords = panel2.PointToScreen(mouseCoordInPanel2);

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

Point mouseCoordInPanel1 = panel1.PointToClient(screenCoords);

为此,您必须在 Panel2 中有一个 MouseMove 处理程序,您在其中进行了此转换,并且 Panel2 需要对 Panel1 的引用才能调用panel1.PointToClient()

于 2013-06-13T14:06:32.850 回答
0

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

于 2013-06-13T14:08:25.213 回答
0

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

于 2013-06-13T14:20:45.273 回答