アプリの高DPI(High DPI)対応について 第3回 ~ マニフェストでアプリのDPI対応レベルを変更する ~

マイクロソフトの田中達彦です。
本連載では、今後3年以内に避けて通れないと予測される高DPI(High DPI)への対応について連載します。

[高DPIへの対応レベル]
前回の記事で、アプリの高DPIの対応レベルには以下の3つがあることを紹介しました。

Not DPI Aware : 高DPIに対応していないアプリケーション
System DPI Aware : 高DPIに対応しているアプリケーション。ただし、モニターごとのDPIには対応していません。
Per monitor DPI Aware : Windows 8.1でサポートされたモニターごとのDPIの設定にも対応しています。

例えばWindowsフォームで作成したアプリは、デフォルトでNot DPI Awareアプリになります。

この対応レベルは、マニフェストによって変更することができます。
Windowsフォームを使用したアプリを、高DPIのモニターで自動的に拡大させたくないときは、マニフェストによってアプリのDPI対応レベルをSystem DPI AwareまたはPer monitor DPI Awareに変更します。

[Visual Studioによるマニフェストの追加]
マニフェストを設定するには、Visual Studioを使うと便利です。
ここでは、Visual Studio 2013 Update 3を使用してマニフェストを追加する方法を紹介します。

まずは、DPIの対応レベルを変更したいアプリのプロジェクトをVisual Studio 2013で開きます。
そして、ソリューション エクスプローラーに表示されているプロジェクト名の部分を右クリックし、[追加]-[新しい項目]を選択します。

以下の[新しい項目の追加]ダイアログが表示されるので、中央ペインの中から[アプリケーション マニフェスト ファイル]を選び、[追加]ボタンをクリックします。

これで、プロジェクトにapp.manifestというファイルが追加されました。
デフォルトで作成されるapp.manifestには、互換性に関する項目が入っています。
デフォルトで入っている内容を、以下のものに書き換えます。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
    manifestVersion="1.0"
    xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings
    xmlns="https://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

ここでは、dpiAwareとしてtrue(黄色くマーカーしている部分)を設定しています。
これにより、DPIの対応レベルはSystem DPI Awareになります。
このtrueと書かれた部分をper monitorに変更すると、DPIの対応レベルがPer monitor DPI Awareになります。

なお、Visual Studio 2013 Update 3では、app.manifestを変更した後で実行すると、マニフェストの内容がアプリに反映されます。
Update 2以前のVisual Studio 2013をご使用の場合は、Visual Studioからアプリを起動してもマニフェストの内容が反映されていません。
その場合は、アプリをビルドした後に、エクスプローラー上から直接.exeファイルを起動してください。

[マニフェストによる対応レベルと実際のDPIへの対応]
マニフェストによるDPI対応レベルの設定は、あくまでもアプリ側がOS側にどのレベルに対応しているかを通知するだけにすぎません。
アプリ本体をさまざまなDPIに対応させるためには、コードによる実装が必要な場合があります。
例えばWindowsフォームで作成したアプリをSystem DPI AwareまたはPer monitor Awareに対応させるためには、高解像度でもUI要素が大きく表示させるような実装が必要です。
WPFの場合はSystem DPI Awareへの対応は必要ありませんが、Per monitor DPI Awareに対応するためには、それに応じた実装が必要です。

[次回]
次回は、さまざまなDPIに対応する例として、Windowsストアアプリの高DPIへの対応がどのような仕組みになっているかを説明します。

[前後の回]
第1回 高DPIとは
第2回 アプリケーションの高DPIへの対応レベル
第4回 高DPIへの対応例 : Windowsストアアプリの対応方法

マイクロソフト
田中達彦