gpt4 book ai didi

winforms - 如何恢复最小化形式

转载 作者:行者123 更新时间:2023-12-05 01:27:52 33 4
gpt4 key购买 nike

这是一个如此平凡的问题,我以为我可以立即解决它,但没有。
我的表单大小和位置在退出时保存在应用程序设置中,以便在应用程序下次运行时恢复。如果用户在最小化时关闭表单,我将无法恢复到正常状态。窗体恢复为最小化,单击任务栏按钮什么也不做。我在 FormClosing 事件中保存位置和大小,但如果表单被最小化,我将保存最小化的大小 (160, 40) 和位置 (-32000, -32000),这对于恢复表单是完全不正确的。我想强制表单永远不会恢复最小化,而是恢复到最后的正常大小和位置。不知何故,我必须在表单最小化之前捕获大小和位置并保存它,然后在 FormClosing 上,如果表单被最小化,则不保存大小和位置。这可能不是 100% 清楚,但我希望有人对此有所了解。

表单关闭处理程序:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
Settings.Default.WindowLocation = Location;
Settings.Default.WindowSize = Size;
Settings.Default.WindowState = WindowState;
Settings.Default.Save();
}

恢复代码:
    private void RestoreWindow()
{
Location = Settings.Default.WindowLocation;
if(Location.X == 0 && Location.Y == 0)
StartPosition = FormStartPosition.CenterScreen;

Size = Settings.Default.WindowSize;

WindowState = FormWindowState.Normal;

if(Size.Width > Screen.PrimaryScreen.WorkingArea.Width)
{
Location = new Point(0, Location.Y);
Size = new Size(Screen.PrimaryScreen.WorkingArea.Width, Size.Height);
}

if(Size.Height > Screen.PrimaryScreen.WorkingArea.Height)
{
Location = new Point(Location.X, 0);
Size = new Size(Size.Width, Screen.PrimaryScreen.WorkingArea.Height);
}
}

最佳答案

你不应该保存 LocationSize如果它不处于正常状态,则为您的表单:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.WindowState == FormWindowState.Normal) {
Settings.Default.WindowLocation = Location;
Settings.Default.WindowSize = Size;
}
Settings.Default.WindowState = WindowState;
Settings.Default.Save();
}

您的恢复窗口例程没有完全意义。如果要使表单居中,为什么要保存位置?以最小化模式启动程序可能是不可取的,在这种情况下,我会将其默认为 Normal :
private void RestoreWindow()
{
this.Location = Settings.Default.WindowLocation;
this.Size = Settings.Default.WindowSize;

// check for size or location off-screen, etc.

if ((FormWindowState)Settings.Default.WindowState == FormWindowState.Minimized)
this.WindowState = FormWindowState.Normal;
else
this.WindowState = Settings.Default.WindowState;
}

如果您需要恢复窗口所在的最后一个正常位置,那么您可以使用 OnResizeEnd覆盖以保存设置:
protected override void OnResizeEnd(EventArgs e) {
if (this.WindowState == FormWindowState.Normal) {
Properties.Settings.Default.Location = this.Location;
Properties.Settings.Default.Size = this.Size;
}
base.OnResizeEnd(e);
}

那么你的闭幕事件就是:
protected override void OnFormClosing(FormClosingEventArgs e) {
Properties.Settings.Default.WindowState = this.WindowState;
Properties.Settings.Default.Save();
base.OnFormClosing(e);
}

关于winforms - 如何恢复最小化形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688450/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com