Windows Forms で高DPI(HDPI)対応

C#Windows フォーム アプリケーション(.NET Framework)で開発したプログラムは、WPFなどと違い高DPI対応へ対応していません。ここでは、そのようなプログラムを高DPI環境でも正常に表示される方法を紹介します。

 

では、順を追って説明します。

まず、プロジェクトを「C#Windows フォーム アプリケーション(.NET Framework)」で作成します。

図 「Windows フォーム アプリケーション(.NET Framework)」プロジェクト

簡単なフォームをデザインし、高DPI対応へ対応を調べてみます。以降に、フォームのデザイン画面を示します。

図 フォームの様子

 

このプログラムを拡大縮小レイアウトの、100%と150%で表示してみましょう。

図 100%

図 150%

Windows フォーム アプリケーション(.NET Framework)」で開発したプログラムは高DPI対応へ対応していないため、拡大縮小レイアウトの値を変更すると文字などが滲みます。フォームによってはデザインが崩れてしまします。これを、完全ではありませんが、一般的な使用に耐えうる高DPIへ対応させてみましょう。

 

AutoScaleMode

Form プロパティの AutoScaleMode を Dpi に設定します。

図AutoScaleMode を Dpiへ

あるいは、デザイン時に変更せず、Formのコンストラクタに以下の行を追加する方法でも構いません。

AutoScaleMode = AutoScaleMode.Dpi;


app.manifest を作成し、コメントを外す

プロジェクトを選択した状態で [右クリック] → [追加]  →  [新しい項目]  →  [アプリケーション マニフェスト ファイル (Windows のみ)] を押してプロジェクト下に app.manifest ファイルを作成します。

図 アプリケーション マニフェスト ファイル

app.manifest ファイルの、以下のコメントになっている部分を有効にします。

のコメントを外し、以降のようにする。

図コメント部分を有効化

このコードが [アプリケーション マニフェスト ファイル] に存在しない場合は、上記コードをマニフェスト ファイルに追加してください。

 

完了

これによって、Windows フォームアプリケーションが高 DPI 対応となります。この程度の設定で、高DPI(HDPI)対応となり、表示がぼやけることはなく快適に使用できます。

このような処理を行ったプログラムを拡大縮小レイアウトの、100%と150%で表示してみましょう。

表示から分かるように、文字の滲みはありません。

 

例外

ただし、WPFなどのように完全に高DPIをサポートできません。この設定では、 1) 起動中のDPI変更サポート(Dynamic DPI)、 2) モニタ別のDPIサポート(Per monitor DPI)は、サポート対象外です。また、フォントの種類などによっては、不都合が発生する場合があります。ただ、一般的なアプリケーションでは、これだけで十分です。

 

ほかに、フォームのFontはYu Gothic UIかMeiryo UIになどとし、フォントはレイアウトが崩れる原因になりますのでビットマップ部分を含むものは避けましょう。また、ほとんど利用することはないと思いますが、ピクセル単位の操作をするときは96dpiに対する、現在のDPI比率を宣言しておき、補正します。

例:DpiScale = *1.CreateGraphics().DpiX) / 96;

この係数を、ピクセル操作の際に乗じてください。

 

.NET Frameworkを利用せず.NET を利用

.NET 6 などを利用すると、高DPIでも文字などの滲みは観察されないので、新規のプロジェクトなら、.NET Frameworkを利用せず.NET を利用するのも良いでしょう。

 

*1:new System.Windows.Forms.Form(