我在另一个面板(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的偏移量。所以我只需要鼠标移动,没有别的。感谢答案 0 :(得分:0)
您还必须分配给其他小组的活动。
答案 1 :(得分:0)
如果您只需要在按住鼠标按钮时执行此操作(例如,因为您正在跟踪拖放操作或选择),那么您可以执行以下操作:
this.Capture = true;
this.Capture = false;
- 注意:如果您忘记执行此操作,则同一进程中的其他控件将不会收到任何鼠标消息。除此之外,在不向其他控件添加鼠标处理程序的情况下从其他控件获取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位置的变化;不需要硬编码但在运行时更新的值)。