获取不同控件的鼠标位置
本文关键字:鼠标 位置 控件 获取 | 更新日期: 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处理程序中,调用
- 现在你的鼠标移动处理程序将接收鼠标移动消息,即使鼠标在另一个控件上。
- 在你的MouseUp处理程序中,调用
this.Capture = false;
-注意:如果你忘记这样做,你在同一进程中的其他控件将不会收到任何鼠标消息。
this.Capture = true;
除此之外,如果不向其他控件添加鼠标处理程序,从其他控件获取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位置的变化;不需要硬编码但在运行时更新的值)