如何获取相对于窗体的位置?

4

我正在实现一个应用程序,可以在面板中拖放图像,因此我希望确保图像被放置在面板内,并且当其被放下时,整个图像都可见。在这种情况下,我想要在拖放事件期间获取当前光标位置。那么如何获取与面板相关的光标位置呢?以下是面板拖放事件的方法。

private void panel1_DragDrop(object sender, DragEventArgs e)
{
    Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;

    if (c != null)
    {
        if (e.X < 429 && e.X > 0 && e.Y<430 && e.Y>0)
        {
            c.Location = this.panel1.PointToClient((new Point(e.X, e.Y)));**

            this.panel1.Controls.Add(c);
        }
    }  
}

你想要使用panel1.TopLevelControl.PointToClient()吗?也就是使用窗体(Form)吗? - Benjamin Podszun
添加了我所指的示例。 - Dynami Le Savard
1个回答

3
您可以使用Cursor.Position获取光标坐标,这将为您提供屏幕坐标。然后,您可以将这些坐标传递到PointToClient(Point p)中。
Point screenCoords = Cursor.Position;
Point controlRelatedCoords = this.panel1.PointToClient(screenCoords);

虽然我相当确定DragEventArgs.XDragEventArgs.Y已经是屏幕坐标了,但你的问题可能出在

 if (e.X < 429 && e.X > 0 && e.Y<430 && e.Y>0)

这个看起来像是检查面板坐标,而e.Xe.Y是屏幕坐标。在检查边界之前,应将其转换为面板坐标:

 Point screenCoords = Cursor.Position;
 Point controlRelatedCoords = this.panel1.PointToClient(screenCoords);
 if (controlRelatedCoords.X < 429 && controlRelatedCoords.X > 0 && 
     controlRelatedCoords.Y < 430 && controlRelatedCoords.Y > 0)
 {

 }

但在这种情况下,有时候拖动的图像的一部分可能会在面板边缘不可见。因为光标可以指向面板中的任何位置。 例如:当光标指向接近边缘时。 这就是为什么我要检查拖动点是否与面板边界相交。 有没有解决方案? - Dinu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接