rksoftware

Visual Studio とか C# とかが好きです

Windows フォーム手書き時の注意 AutoScaleDimensions 設定

前回、Windows フォームアプリケーションで、Form.Designer.cs ファイルを手編集する記事を書きました。
その中で一点、良く知らなくてコメントにしてごまかした行がありました。

// 
// Form1
// 
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);

公式ドキュメントもありますが読んでも良くわからなかったので確認してみました。

■ High DPI 環境での設定

この設定は High DPI 環境で意味を持つ設定でした。
正直、High DPI 環境で Windows フォームアプリケーションの開発をした経験がなかったので今まで意識したことがなかったです。さらに、High DPI 環境での動作ではなく、開発時に関係する設定のようでこれがまたレア度が高いですね。

Visual Studio の動作環境の設定

この値が何を意味しているかというと、Visual Studio (フォームのデザイナ) がどんな表示スケール設定で動作していたかを記録しているもののようです。
説明が難しいので実例を挙げてみましょう。

開発PCの表示スケール 100% 150% 175% 200%
デザイナーで設定される AutoScaleDimensions (6F,12F) (10F, 18F) (11F, 21F) (13F, 24F)
100% との比率 (100%, 100%) (166%, 150%) (183%, 175%) (216%, 200%)
100% が (6.5F, 12F) とした場合の比率 (100%, 100%) (153%, 150%) (169%, 175%) (200%, 200%)
サイズを (200,200) に設定したコントロールの実行時の実サイズ (200,200) (120, 133) (109,114) (92, 100)

各二つ目の数字 ( (Width, Hight) で (Height の値) です) を見ると分かりやすいですね。
デザイナーが表示スケールの影響を受けているのでその分 戻した 値を使わなくてはならないので、デザイナーを操作している環境の設定を保持しているということのようです。

正直これは難しいですね。環境の違う複数の開発者でソースを共有するのも難しくなりそうです。

■ 対策 手書きする場合

.NET Core 3.0 でテンプレートから生んだ Form.Designer.cs では (12F, 25F) という設定になっていました。
しかし、この値を考慮しながら各コントロールのサイズを設定することは現実的ではないと思います。この設定を消してしまうもしくは、100% の場合の値 (6F, 12F) に設定しておくのが良いでしょう。

■ デザイナーを使う場合

.NET Framework の場合はデザイナーが使えますし、普通はデザイナーも併用してコントロールを配置すると思います。しかしデザイナーを使うと共有時に面倒...そんな状況の対策も Visual Studio なら大丈夫。High DPI 環境でデザイナーを開くと、デザイナー上部に次のようなメッセージが表示されます。
f:id:rksoftware:20190102212010j:plain

日本語環境ではこんな感じ。
f:id:rksoftware:20190102212024j:plain

100% のスケールで Visual Studio を再起動します をクリックすると、Visual Studio 再起動してスケールが 100% であるものとしてコントロールを設定できます。
素晴らしい。さすが Visual Studio ですね。

■ まとめ

Windows フォームアプリケーションのデザイナーは難しいですね。