当窗口最大化时获取非最大化窗口的位置/大小

5
当用户调整我的程序窗口(Winforms)的大小和位置时,他们希望在关闭并重新打开程序后看到窗口处于同一位置。我所做的是存储窗体的Width、Height、Location.X和Location.Y属性,并在重新打开程序时将其设置回来。
问题在于当窗口被最大化时,Width、Height、X、Y不是指非最大化状态下的宽度/高度/X/Y,而是指最大化的尺寸。
因此,当用户将窗口最大化、关闭并重新打开程序,然后取消最大化窗口时,窗口不会返回到原始位置/大小,而是停留在完整的大小/位置。
因此,在不使用存储变量的方法的情况下,如何获取窗口最大化时的非最大化位置和大小呢?
1个回答

7

我发现解决这个问题最好的方法是使用RestoreBounds结构。窗口最大化时,RestoreBounds将参考旧的(非最大化)大小和位置。以下是查找这些值的代码。只需在关闭时保存这些值,然后重新打开程序时,您可以将表单的宽度、高度、Location.X和Location.Y设置回这些保存的值。

bool b = WindowState == FormWindowState.Maximized;
int xpos = !b? Location.X : RestoreBounds.X;
int ypos = !b? Location.Y : RestoreBounds.Y;
int width = !b? Width : RestoreBounds.Width;
int height = !b? Height : RestoreBounds.Height;

1
你为什么要通过字符串比较枚举类型呢?只需要简单地使用 WindowState != FormWindowState.Maximized 就可以了。 - cremor
根据@cremor的建议,您可以通过将WindowState == FormWindowState.Maximized分配给变量并测试该布尔值来进一步改进此答案。 - David Arno
好的,完成了。我搜索了大约15分钟才找到RestoreBounds属性,所以那就是答案的重点,并且它被应用于我创建的旧代码,所以请原谅我没有进行“优化”以节省5毫秒 ;) - Dan W

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