開発したアプリが長く使える、高解像度ディスプレイへの対応技術
「マイクロソフトのUIを構築するテクノロジの中でも、高DPIに対応しているものと非対応のモノがある」と田中氏は言う。例えばWindowsフォームは高DPIに非対応で、WPFやMFCは高DPIに対応している。Windowsストアアプリはモニターごとの高DPIに対応している。
なぜ、高DPI非対応アプリは高解像度ディスプレイだとぼやけてしまうのか。高DPI非対応アプリは96dpiのモニターで表示されることを前提としているからだ。つまり144dpi相当のスケールのモニターで表示させると、DPIスケール機能によって自動的にアプリを拡大してしまうのである。しかも自動的にアプリを拡大する際に、100%の画面でいったん描画して、それを150%に拡大するという方法をとるため、ぼやけるという現象が起こる。
ではこのような問題を解決するにはどうすればよいのか。
一つは自動拡大をオフにする方法である。エクスプローラー上で該当するexeファイルを右クリックしてプロパティを選ぶ。互換性のタブを選択し、「高DPI設定では画面のスケーリングを無効にする」にチェックを入れる。そしてOKをクリックし、再度該当のプログラムを起動すると、「小さく表示される」という問題は残るがぼやけることはなくなる。「とはいえこの設定をユーザーにお願いするのは無理がある」と田中氏は次のような方法を紹介した。それはVisual Studioによるマニフェストの追加である。まずDPIの対応レベルを変更したいアプリのプロジェクトをVisual Studio2013で開く。ソリューション エクスプローラーに表示されているプロジェクト名の部分を右クリックして、追加、新しい項目をクリック。アプリケーションマニフェストを選択して、次の文に差し替えて実行すれば、クリアに表示されるようになる。
<assemblyxmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>Per monitor</dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly>
このように「アプリケーションマニフェストによって、DPIへの対応具合が定義できる」というわけだ。
「Per monitor」と記述することで、DPIの変化に対応したアプリだと宣言できる。この部分を「true」にすると、Per monitorに対応していないが、高DPIに対応したアプリだと宣言できる。
「ただ、この処理はあくまでアプリケーションが高DPIに対応しているか対応していないかをOSに知らせるためのもの」と田中氏は語る。
では確実に高DPIに対応するにはどうすればよいか。そこで高DPIに対応しているWindowsストアアプリである。WindowsストアアプリではOS側のDPIスケールに対応するため、数種類(スケール100、スケール140、スケール180)の画像データを用意し、ディスプレイのDPIスケールの割合に適した画像を使用する仕組みが組み込まれている。その仕組みによりディスプレイのDPIスケールによって、表示される画像を変えることができるのだ。一方、Windowsフォームの場合は、このような機能は搭載されていない。つまり、Windowsフォームの場合、アプリケーションの中でDPIスケールの割合を取得し、それによって、表示させる画像やフォントの大きさを変えるという処理が必要になるというわけだ。
またWPFをモニターごとのDPIに対応させるにはどのようにすればよいか。その方法として田中氏が推奨したのが、Viewboxというクラスを使う方法である。Viewboxとは、その中に入っている要素を自動的に拡大縮小するためのコンテンツデコレータを定義するもの。つまりViewboxにより、アプリケーション起動後にDPIが変更したというイベントを取得できれば、DPIが変更したというスケールに合わせてアプリケーションそのものを拡大縮小できるようになるというわけだ。
最後に田中氏は次のように語り、セッションを締めた。
「これから高解像度のモニターはどんどん出てくる。ぜひ、今日のセッションを参考に高解像度ディスプレイへの対応を行って欲しい」