アプリケーションを終了して次回起動したとき、前回終了した位置にフォーム(ウィンドウ)を表示させたい場合があるかもしれません。たとえばアプリケーションが動作している様子をキャプチャして動画にしたいときが考えられます。さてどうすればいいでしょうか?

フォームの位置やサイズはプロパティを調べれば簡単にわかります。

フォームの大きさが変更されるとOnResizeメソッドが呼び出され、移動したときはOnMoveメソッドが呼び出されます。そこでフォームのX座標とY座標、幅、高さをタイトルバーに表示するメソッドを作成して、OnResizeメソッドとOnMoveメソッドのなかで呼び出せば現在のフォームのX座標とY座標、幅、高さが表示されます。

実際にやってみるとたしかに表示されているのがわかります。

ではアプリケーションを終了して次回起動したとき、前回終了したときに位置にフォームを表示させたい場合はどうすればいいでしょうか?

終了するときのフォームの座標とサイズを取得してファイルに保存しておけばいいですね。次回の起動時にはこのファイルに保存されている情報からフォームを表示させればいいですね。

ではやってみましょう。

まずこんなクラスをつくります。X座標とY座標をここに保存します。これならあとで気が変わって他の情報(幅、サイズ、最大化されているかどうかなど)を追加したくなったときもすぐに追加できます。

次にForm1クラスですが、まず終了時の情報を保存するファイルを決めないといけません。ここでは実行ファイルがあるフォルダのなかにstart.xmlというファイルを生成してそこに保存します。

コンストラクタ内でファイルのパスを生成します。そして保存されているであろうファイルのなかから情報を読み取るのですが、この処理は自作メソッド MoveStartPositionのなかでおこないます。MoveStartPositionメソッドに関しては後まわしにして、先にファイルに情報を保存する処理を考えます。

フォームが閉じられたときにはOnClosedメソッドが呼び出されます。OnClosedメソッド内で自作メソッド SaveLastPositionを呼び出して処理をしています。

SaveLastPositionメソッドではDocクラスからインスタンスを生成して、StartPositionXとStartPositionYにフォームのX座標とY座標を代入しています。フォームのX座標とY座標はForm.Locationプロパティをみればわかります。そのあとXmlSerializerクラスとStreamWriterクラスをつかってXMLファイルとして座標を保存しています。

次に起動時です。初回起動の場合は「前回の終了」というものがないのでファイルも存在しません。またファイルを自分で編集してしまった場合などファイルの情報をうまく読み出せない場合もあるかもしれません。そこでここでは例外処理をつかいます。

ファイルが存在しない場合や読み取りに失敗した場合は「MoveStartPosition()内で例外発生」と書かれたメッセージボックスが表示されます。ファイルを開くことができたにもかかわらず例外が発生した場合はfinally節でファイルを閉じる処理がおこなわれます。

フォームのXY座標を指定する場合はForm.FormStartPosition.ManualプロパティをManualにしてからForm.Locationプロパティに座標をセットします。

もうちょっと次数を稼ぎたいので、フォームの大きさや最大化がされているかどうかも保存できるようにします。また中央に表示させる方法も考えます。

最初にDocクラスにフィールド変数を追加します。

次に中央に表示するかどうかですが、ユーザーにどうするのか選択させる手段が必要です。ここは安易かもしれませんが、フォームにチェックボックスを貼り付けてチェックされているなら中央に表示する、されていない場合はしないことにします。

最大化されているかどうかとチェックボックスがチェックされているかを保存するのですが、最大化されている状態や最小化されている状態では座標とサイズに意味はありません。最大化されている場合や最小化されている状態で終了するときは直前の通常の状態であったときの座標とサイズが必要です。

そこでふたつのフィールド変数を用意します。そして位置やサイズが変更されたときはここに現在の状態を保存します。

終了時の処理です。最後に取得できたLastLocationとLastSizeを保存します。そして最大化されているかどうかとチェックボックスがチェックされているかどうかを調べてその状態を保存します。

起動したらファイルを読み込んで取得できたデータをもとにフォームを適切な状態で表示させます。