4

これは非常にありふれた問題なので、すぐに修正できると思っていましたが、違います。フォームのサイズと場所は、次回アプリを実行したときに復元するために、終了時にアプリの設定に保存されます。最小化されているときにユーザーがフォームを閉じると、通常の状態に戻すのに問題が発生します。フォームは最小化された状態に戻り、タスクバー ボタンをクリックしても何も起こりません。FormClosing イベントで場所とサイズを保存しますが、フォームが最小化されている場合は、最小化されたサイズ (160、40) と場所 (-32000、-32000) を保存していますが、これはフォームを復元するにはまったく不適切です。フォームが最小化されないように強制したいのですが、最後の通常のサイズと場所に戻ります。どういうわけか、フォームを最小化して保存する前にサイズと場所をキャプチャする必要があり、フォームが最小化されている場合は FormClosing でサイズと場所を保存しません。これはおそらく 100% 明らかではありませんが、

FormClosing ハンドラ:

    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);
        }
    }
4

2 に答える 2

4

Location通常の状態でない場合は、フォームのまたはを保存しないSizeでください。

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);
}
于 2012-05-21T16:01:44.170 に答える
1

Form.WindowState プロパティが FormWindowState.Minimized と異なる場合にのみ、フォームのサイズと位置をそれぞれ Form.Resize イベント ハンドラーと Form.Move イベント ハンドラーのローカル変数に格納します。次に、設定のサイズ変数と位置変数の内容を FormClosing イベント ハンドラーに保存します。

于 2012-05-21T16:07:25.403 に答える