Form.visible必须是真实的读取.left和.top?

时间:2009-07-07 19:38:25

标签: c# winforms forms

我创建了一堆表单,我希望在应用程序关闭/启动时保存并恢复它们的位置。

但是,如果表单不可见,则.top.left都是0.只有当它可见时,这些属性才会填充其“真实”值。

现在我的kludge是显示每个表单,保存信息,然后将其恢复到以前的可见状态:

        int i;
        bool formVisible;

        // Show all current forms and form positions in array frmTestPanels
        i = 0;
        while (frmTestPanels[i] != null)
        {
            formVisible = frmTestPanels[i].Visible;
            frmTestPanels[i].Visible = true;
            note(frmTestPanels[i].Text + "(" + frmTestPanels[i].Left.ToString() + ", " + frmTestPanels[i].Top.ToString() + ") visible: " + formVisible.ToString());
            frmTestPanels[i].Visible = formVisible;
            i++;
        }
        note(i.ToString() + " forms present");

note()是一个只显示信息的简单函数。

当然,这会导致关闭时闪烁所有不可见的形式(可能在启动时也是如此?没有那么远......)这是不可取的。

  • 当表单不可见时,还有其他方法可以获取表单的顶部和左侧吗?
  • 或者,是否有更好的方法来保存和恢复表单状态?

5 个答案:

答案 0 :(得分:1)

您需要在窗体上捕获Closing和Minimizing事件,并在该时间点存储位置。

隐藏或最小化表单时,这些字段无效。

答案 1 :(得分:1)

每当用户解除/隐藏/关闭/使表单隐形/变形时,保存其位置。此时。如果用户正在删除表单,它必须已经在屏幕上,您不必担心它不可见。

另一方面,在用户第一次要求之前,请不要创建表单。创建每个表单时,请读取其存储的位置并相应地进行设置。

使用此方案,如果表单永远不会显示给用户,则其位置将永远不会被恢复或保存。

答案 2 :(得分:0)

当用户关闭表单时,而不是在应用程序关闭时保存表单位置怎么样?

答案 3 :(得分:0)

您不能只为每个表单的Move事件附加一个事件处理程序,并在它们移动时跟踪它们的位置吗?它们的位置只有在它们可见时才会改变,但这样一来,当它们移动时会得到通知。然后,您可以在关闭时将每个Form的位置的本地缓存转储到磁盘。

我对表单创建没有合适的想法,但我认为可以在指定的初始位置显示它们。毕竟有一个Form.StartupPosition属性。并且Form.Location。根据文档,这应该有用。

答案 4 :(得分:0)

如果用户从未看过表单,则Top和Left不适用,是吗?因为它们与视觉位置有关,并且没有视觉位置......

一旦用户至少显示一次该表单,您可以将Top和Left捕获到本地变量中,然后再次隐藏它,并在释放表单时使用这些本地变量来存储位置。然后,您可以在下次表单可见时获得初始位置。