获得不同控制的鼠标位置

时间:2013-06-13 13:59:33

标签: c# mousemove

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

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

即使鼠标在panel2上,我怎样才能读取鼠标参数?谢谢!

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

编辑2:我不是想拖动它,只是读取原始面板(panel1)的坐标,这样我就可以计算缩放面板2的偏移量。所以我只需要鼠标移动,没有别的。感谢

4 个答案:

答案 0 :(得分:0)

您还必须分配给其他小组的活动。

答案 1 :(得分:0)

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

  1. 在MouseDown处理程序中,调用this.Capture = true;
  2. 现在,即使鼠标悬停在另一个控件上,您的MouseMove处理程序也会收到鼠标移动消息。
  3. 在MouseUp处理程序中,调用this.Capture = false; - 注意:如果您忘记执行此操作,则同一进程中的其他控件将不会收到任何鼠标消息。
  4. 除此之外,在不向其他控件添加鼠标处理程序的情况下从其他控件获取MouseMove消息非常棘手。

    关于this.Capture的主要问题是你需要一个好时机将它设置为true,另一个好时机将它设置为false。一般来说,这就像我描述的那样在MouseDown和MouseUp中完成。

    但是,您也可以将Panel2中的坐标相对于Panel1相对转换为相对于:

    从Panel2 coords转换为屏幕坐标:

    Point screenCoords = panel2.PointToScreen(mouseCoordInPanel2);
    

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

    Point mouseCoordInPanel1 = panel1.PointToClient(screenCoords);
    

    要做到这一点,你必须在Panel2中有一个MouseMove处理程序,你进行了这个转换,而Panel2需要一个对Panel1的引用才能调用panel1.PointToClient()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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