我还有一个面板(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 = PANEL1 100。 如果我将我的是Panel2鼠标左上角它给我的坐标例如1x1的,在这里我需要的位置上像101x101 PANEL1
编辑2:我并不想拖动它,只是读原装面板(PANEL1)的坐标,这样我就可以计算出缩放是Panel2偏移。 所以我只需要鼠标移动,没有别的。 谢谢
如果你只需要做到这一点,而鼠标按键被按下(例如,因为您要跟踪拖放操作或选择),那么你可以做到以下几点:
- 在你的MouseDown处理程序,调用
this.Capture = true;
- 现在,即使当鼠标移动到另一个控制您的MouseMove处理器将接收鼠标移动的消息。
- 在你的MouseUp处理程序,调用
this.Capture = false;
- 注意:如果你忘记这样做,在同一进程的其他控件将不会收到任何鼠标消息。
除此之外,这是非常棘手的来自其他控件的MouseMove消息,而无需添加鼠标处理程序的其他控件。
的主要事情this.Capture
是,你需要一个好时机,它设置为true,另一个设定好时间回假。 一般情况下,这是一个在的MouseDown和MouseUp我的描述进行。
但是,你也可以从是Panel2相对的COORDS转换为Panel1的相对就像这样:
从是Panel2 COORDS转换为屏幕坐标:
Point screenCoords = panel2.PointToScreen(mouseCoordInPanel2);
然后从屏幕COORDS到Panel1的相对COORDS转换:
Point mouseCoordInPanel1 = panel1.PointToClient(screenCoords);
要做到这一点,你就必须有一个是Panel2处理的MouseMove,你这样做转换,是Panel2需要以打电话Panel1的参考panel1.PointToClient()
你不能把事件处理程序是Panel2,然后用左/ PANEL1和是Panel2的顶部性质,以抵消是Panel2内的鼠标位置获得PANEL1所需的位置?
我还认为,到第二面板分配一个事件将是最好的事情。 当鼠标在面板1,坐标将被直接提供; 当它是上面板2,它们会被占两个面板之间的相对位置被转换(非常简单:变化X / Y位置;其不需要被硬编码,但在运行时更新后的值)。