C# 如何确定MDI子表单';谁的屏幕位置?

C# 如何确定MDI子表单';谁的屏幕位置?,c#,winforms,C#,Winforms,我有一个主窗体'MainForm',IsMdiContainer=true 我有一个或多个动态创建的子窗体,其中设置了MDIPRENT=MainForm 现在我想做的是通过设置MDIPRENT=null来分离这些子窗体,但要保持完全相同的屏幕位置 我曾尝试使用ChildForm.PointToScreen(ChildForm.Location),但这会给出相对于表单客户端区域的屏幕位置 编辑 表单本身上的PointToScreen()提供了几乎正确的位置,只是它在表单内部提供了0,0的屏幕位置,

我有一个主窗体'MainForm',IsMdiContainer=true

我有一个或多个动态创建的子窗体,其中设置了MDIPRENT=MainForm

现在我想做的是通过设置MDIPRENT=null来分离这些子窗体,但要保持完全相同的屏幕位置

我曾尝试使用ChildForm.PointToScreen(ChildForm.Location),但这会给出相对于表单客户端区域的屏幕位置

编辑


表单本身上的PointToScreen()提供了几乎正确的位置,只是它在表单内部提供了0,0的屏幕位置,而.location指的是表单的外边缘。

您必须使用父级mdi客户端窗口的PointToScreen()方法:


您无法避免在Aero上的轻微偏移,也无法避免闪烁。

您必须使用父级mdi客户端窗口的PointToScreen()方法:


您无法避免在Aero上的轻微偏移,也无法避免闪烁。

这不起作用,因为我在“MainForm”中停靠了其他项目。上面的代码将表单定位到“MainForm”的相对距离与之前到MdiClient区域的相对距离相同。您必须找到MdiClient窗口,以便使用其PointToScreen方法。通过迭代父控件集合找到它,使用“is MdiClient”进行测试。或者只是调整一下位置,结果很好。剩下的唯一一件事就是在MdiClient中正确地重新定位表单,这似乎是不可能的。表单是级联的或固定在0,0:)这不起作用,因为我在“MainForm”中停靠了其他项。上面的代码将表单定位到“MainForm”的相对距离与之前到MdiClient区域的相对距离相同。您必须找到MdiClient窗口,以便使用其PointToScreen方法。通过迭代父控件集合找到它,使用“is MdiClient”进行测试。或者只是调整一下位置,结果很好。剩下的唯一一件事就是在MdiClient中正确地重新定位表单,这似乎是不可能的。该窗体是级联的,或固定在0,0:)
    private void button1_Click(object sender, EventArgs e) {
        if (this.MdiParent != null) {
            MdiClient client = null;
            foreach (Control ctl in this.MdiParent.Controls) {
                if (ctl is MdiClient) { client = ctl as MdiClient; break; }
            }
            this.WindowState = FormWindowState.Normal;
            Point loc = client.PointToScreen(this.Location);
            this.MdiParent = null;
            this.Location = loc;
        }
    }