VB.NETでウィンドウサイズを保存する時、ClientSizeをバインドしてはいけない

Windowsフォームアプリケーションを作成する際。まあてきとーにデザイナーでUI作ってちょこちょこコードを書けば動いてしまうので、VB.NETはすばらしい。ところでアプリケーション起動時のウィンドウの位置やサイズは何も考えないで作ると、モニターの左上、フォームデザイナーで作成したときの初期サイズで毎回開かれる。普通のデスクトップアプリなら、ウィンドウを動かしたりリサイズした状態で終了すれば、次回起動時にその位置および大きさで開くことを期待するわけで、「はてどうしたらいいのかな?」と思って検索すると

Windowsアプリケーションの位置やサイズを保存するには?[2.0のみ、C#、VB] − @IT

みたいなやり方が出てくるのだけど、これは罠。Locationについてはこれでいいのだけど、ウィンドウサイズをこの方法で保存するとひどいことになる。次回起動時にそのサイズで開いてくれるのは確かなんだけど、ウィンドウの中のTextBoxとかのコントロールが追随したサイズになってくれない。せっかくデザイナー上でアンカー張って、リサイズに追随するようにしていても、ウィンドウを保存したサイズで作ってからコントロールを生成する形になってるので、どうにもならないのだ。コントロールが固定位置、固定サイズなアプリならいいけど、テキストエディタとかお絵描きツールとか、Webブラウザとかじゃあ、まるで使いものにならない。

 

解決方法

プロジェクトのプロパティを開き、「設定」でウィンドウサイズを保存する変数を作成する。たとえば

名前:MyClientSize

型:System.Drawing.Point

スコープ:ユーザー

値:640,480

みたいに。「値」のところはデザイナーで作成したフォームのサイズを入れておけばいいだろう。

そんでもって、FormのプロパティからFormClosingイベントのハンドラ(例えばForm1_FormClosing())を作って、そこに

My.Settings.MyClientSize = Me.ClientSize

Loadハンドラ(例えばForm1_Load())に

Me.ClientSize = My.Settings.MyClientSize

と記述すればOK。この方法だと、フォームとコントロールが生成された「後で」ウィンドウサイズを変更している形になるので、リサイズイベントが起こってコントロールが適切に再配置される。