Windows ビジュアルスタイルを変更すると、フォームのサイズが変化したり、配色が変化したりします。これを意識しないで開発していると、アプリケーションの開発時と実行時のスタイルが異なる場合に、フォームのサイズが小さい、または大きい、配色のバランスが悪いといった予期しない状態になることがあります。では、どのスタイルでも同じようなサイズや、バランスのとれた配色にするにはどうしたらいいのでしょうか。

スタイルによりフォームのサイズが変化する

 まず、なぜ開発時と実行時のスタイルの違いによってフォームのサイズが変化するかについて説明します。開発時にデザイナ画面のプロパティウィンドウから Size プロパティを設定した場合、それがコードとして自動生成される際に ClientSize プロパティに対する設定に置き換わっています。この時に開発時のスタイルによって非クライアント領域のサイズ(タイトルバーと境界線)の大きさが異なるため ClientSize プロパティに設定される値もその分だけ変化します。

 いっぽう実行時は、開発時のスタイルのクライアント領域のサイズと実行時のスタイルの非クライアント領域のサイズが、フォームのサイズになります。開発時と実行時でスタイルが異なれば非クライアント領域のサイズも異なるため、その分フォームのサイズが異なってしまいます。

フォームのサイズは実行時に設定する

 では、どのようにして実行時のフォームのサイズをどのスタイルでも同じようにするかというと、それは実行時にフォームのサイズを設定することで解決します。Size プロパティを設定することで、フォーム全体のサイズが実行時に統一され、ClientSize プロパティを設定することで、フォームのクライアント領域のサイズが実行時に統一されます。

 通常はフォーム全体のサイズよりクライアント領域のサイズを意識してフォームのサイズを設定していると思います。その場合は、実行時に ClientSize プロパティを設定することで、どのスタイルでも同じクライアント領域のサイズのフォームになります。

 実行時に設定するといっても具体的にどのタイミングで設定すればいいかというと、自動生成された ClientSize プロパティの設定(InitializeComponent メソッド)が終わった後であればいつでもいいと思います。たとえば、コンストラクタで InitializeComponent メソッドを呼び出した後や、フォームのロードイベントなどが考えられます。

 デザイナ画面のプロパティウィンドウに ClientSize プロパティがあれば、開発時にフォームのサイズが統一できるためいいと思います。また Size プロパティを簡単に設定できる Height Width プロパティはあるのに、ClientSize プロパティを簡単に設定できる ClientHeight ClientWidth プロパティがありません。このことから「クライアント領域のサイズは気にせずフォーム全体のサイズだけ気にしてろ!」という暗黙の声が聞こえてきます。