2026年10月28日水曜日

Windows Formアプリでの高 DPI サポート

Windows Formアプリでの高 DPI サポート

Windowsでディスプレイの表示を拡大したとき、Formアプリでは文字表示などがボケてしまう。また、アプリ操作中にウインドウが拡大されなくなることも発生した。

 Windows Formアプリでの高 DPI サポートを有効にすることで文字がくっきり表示され、ウインドウサイズが縮まる現象も回避できる。

ただし、UI部品によってフォントが拡大されないもがあり、またアイコンの中の画像も拡大されない。若干UIレイアウトの乱れも発生する。

以下、Microsoftのサポートページから必要最小限の部分だけまとめたもの。
https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/high-dpi-support-in-windows-forms

サポート対象:
.NET Framework 4.7 以降、Windows Form
Windows 10 Creators Update 以降の Windows で有効

Windows 10 との互換性を宣言
プロジェクトにapp.manifestを追加する。
 ソリューションエクスプローラでプロジェクトを右クリック
 ⇒ 追加 ⇒ 新しい項目⇒「マニフェスト」で検索
 ⇒「アプリケーション マニフェスト ファイル(Windows のみ)
」を選択

app.manifest の compatibilityの中のWindows 10のコメントを外す。

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <!-- Windows 10 compatibility -->
    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
  </application>
</compatibility>

トリッキーポイント
ディスプレイのDPIに合わせてきれいに描画したい場合はこの宣言を有効にする。
ディスプレイ拡大率に応じてFormアプリを拡大させたい場合は、敢えてこの宣言をコメントアウトする。
宣言が有効だとWindows 10以降対応のアプリとして扱われるため、Formアプリでは期待した動作にならないことがある。

app.config ファイルでモニターごとの DPI 認識を有効にする

app.config の configuration の最後に DpiAwareness を追加する。

<configuration> <!-- ... other xml settings ... --> <System.Windows.Forms.ApplicationConfigurationSection> <add key="DpiAwareness" value="PerMonitorV2" /> </System.Windows.Forms.ApplicationConfigurationSection> </configuration>
Probram.csでEnableVisualStyles を呼ぶ
Mainをstaticにし、Runの前に二行追加する。

static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); }
EnableVisualStyles
Formアプリの外観を、OSのテーマに合わせたデザインにするためのメソッド

SetCompatibleTextRenderingDefault
Formアプリ全体のテキスト描画エンジンを設定するためのメソッド

パラメータ
false = TextRenderer.DrawText を使った描画

Formのプロパティー AutoScaleMode変更
対象のFormのAutoScaleModeをFontからDpiに変更。
これも、アプリの拡大のためにはFontのままにした方がよい場合があるかもしれない。

DataGridViewのプロパティー AutoSizeColumnsMode変更
Fillに設定。アプリ拡大時にカラム幅を広げる。
DataGridViewのプロパティー AutoSizeRowsMode変更
DisplayedCellsまたはAllCellsExceptHeadersに設定。アプリ拡大時に文字表示に合わせてRowを広げる。

開発時/デバッグ時の注意事項

フォームのデザインは必ず 100%(96 DPI) のディスプレイ環境で行う。
異なるDPI環境でデザイナーを開くと AutoScaleDimensions が書き換わり、レイアウトやコントロールのサイズが崩れる原因になる。
レイアウトが崩れると復旧が面倒なので、プロジェクトのバックアップを忘れずに!


0 件のコメント:

コメントを投稿