我创建了一堆表单,我希望在应用程序关闭/启动时保存并恢复它们的位置。
但是,如果表单不可见,则.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()
是一个只显示信息的简单函数。
当然,这会导致关闭时闪烁所有不可见的形式(可能在启动时也是如此?没有那么远......)这是不可取的。
答案 0 :(得分:1)
您需要在窗体上捕获Closing和Minimizing事件,并在该时间点存储位置。
隐藏或最小化表单时,这些字段无效。
答案 1 :(得分:1)
每当用户解除/隐藏/关闭/使表单隐形/变形时,保存其位置。此时仅。如果用户正在删除表单,它必须已经在屏幕上,您不必担心它不可见。
另一方面,在用户第一次要求之前,请不要创建表单。创建每个表单时,请读取其存储的位置并相应地进行设置。
使用此方案,如果表单永远不会显示给用户,则其位置将永远不会被恢复或保存。
答案 2 :(得分:0)
当用户关闭表单时,而不是在应用程序关闭时保存表单位置怎么样?
答案 3 :(得分:0)
您不能只为每个表单的Move事件附加一个事件处理程序,并在它们移动时跟踪它们的位置吗?它们的位置只有在它们可见时才会改变,但这样一来,当它们移动时会得到通知。然后,您可以在关闭时将每个Form的位置的本地缓存转储到磁盘。
我对表单创建没有合适的想法,但我认为可以在指定的初始位置显示它们。毕竟有一个Form.StartupPosition属性。并且Form.Location。根据文档,这应该有用。
答案 4 :(得分:0)
如果用户从未看过表单,则Top和Left不适用,是吗?因为它们与视觉位置有关,并且没有视觉位置......
一旦用户至少显示一次该表单,您可以将Top和Left捕获到本地变量中,然后再次隐藏它,并在释放表单时使用这些本地变量来存储位置。然后,您可以在下次表单可见时获得初始位置。