Windows Form アプリケーションの高DPI対応- 高DPI画面で画面がにじまないようにする - C#
Windows Form アプリケーションで高DPI画面で画面がにじまないようにする方法を紹介します。
概要
Windowsのディスプレイの設定で[拡大/縮小]の設定が100%以上の高DPI環境でWindows Formアプリケーションを実行すると、
表示がにじんだり、表示が荒くなる現象が発生します。この記事では、高DPI環境でWindows Formアプリケーションを実行した場合に、
表示がにじまないようにする方法を紹介します。
標準の動作
デフォルトの設定でWindowsFormアプリケーションを作成した場合の動作を確認します。
UI
下図のフォームを作成します。
ラベル、テキストボックス、ListViewを配置します。
コード
コードは追加の実装はありません。
実行結果
プロジェクトを実行します。
[拡大/縮小]の設定が100%の場合、下図の表示となります。
[拡大/縮小]の設定が125%の場合、下図の表示となります。タイトルバーのキャプションに比べ、フォーム内のラベルやテキストボックスの表示が
滲んで表示されていることが確認できます。また、リストビューのアイコンも拡大されます。
[拡大/縮小]の設定が150%の場合です。こちらも、フォームのタイトルバーのキャプションに比べ、フォーム内のコントロールの表示がにじんでいます。
リストビューのアイコンも拡大されて表示されるため、アイコンの画質も落ちます。
[拡大/縮小]の設定が200%の場合です。2倍の表示となるため、滲みはありませんが、単純に1ドットが4ドットとして表現されているため、フォーム内のコントロールの
文字の表示が荒れて表示されていることがわかります。リストビューのアイコンも元のサイズの2倍の大きさで表示されます。
対処法
高DPI環境に対応するには、初めにアプリケーションのターゲットフレームワークを .NET Framework 4.7 以上に設定します。
プロジェクトのプロパティを表示し、[アプリケーション]のカテゴリの[対象のフレームワーク]を ".NET Framework 4.7" 以上に設定します。
ターゲットフレームワークの変更後、App.config ファイルに設定を追記します。
高DPIに対応する場合は、
System.Windows.Forms.ApplicationConfigurationSection
セクションに、
add
タグを記述し、
DpiAwareness
キーの値を
PerMonitorV2
に設定します。
(なお、高DPIに明示的に対応しない場合は、
DpiAwareness
キーの値を
false
に設定します。)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>
実行結果
App.config ファイルを修正後にプロジェクトを実行します。
[拡大/縮小]の設定が100%の場合、下図の表示となります。
100%の場合は高DPI対応前と表示は変わりません。
[拡大/縮小]の設定が125%の場合、下図の表示となります。高DPI対応前の表示に比べて滲まずに表示できていることが確認できます。
リストビューのアイコンは元のサイズから変化せず、拡大されずに表示されます。
[拡大/縮小]の設定が150%の場合です。こちらも、フォーム内のコントロールの文字の表示が高DPI対応前より鮮明に表示できています。
リストビューのアイコンは拡大されずに表示されます。
[拡大/縮小]の設定が200%の場合です。高DPI対応前はフォーム内のコントロール文字の輪郭が荒れた表示になっていましたが、
高DPIに対応することで滑らかに表示できています。
リストビューのアイコンサイズが元のサイズから拡大されずに表示されるため、リストビューの1行に表示される項目数が若干変化しますが、
アイコンの画質は落ちずに表示されています。
Windows Form アプリケーションで高DPIのディスプレイでの表示に対応できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用