Jiro Laboratory

C#、ASP.NET、JavaScript、Androidとか

Windows フォームでなぜか文字がぼける時(High DPI)

なぜか文字がぼける

高解像度(1920 x 1080以上?)のディスプレイでWindowsフォームアプリを実行すると、
f:id:jirolabo:20150115234146p:plain
このように文字がぼけることがあります。
ちょっと分かりづらいかもしれませんので、下のVisual Studio でのデザイン時の画像と比較してみてください。
f:id:jirolabo:20150115234158p:plain

違いが分かるでしょうか?
上の画像のフォームは文字がぼやっとしています。
どうしてこのような表示になってしまうかと言うと、Windows フォームが高DPI(High DPI)に対応できていないのが原因です。

Windowsフォームは高DPIには対応せず、一部のコントロールのみ高DPIに対応しています。
高DPIに対応していないアプリの場合は、DPIの拡大率に応じてOS側が自動的にアプリを拡大して表示させます。
そのため、このWindowsフォームのようにUI要素がぼやけてしまうことがあります。

アプリの高DPI(High DPI)対応について 第1回 ~ 高DPIとは ~ - 田中達彦のブログ - Site Home - MSDN Blogs

Windows FormにおけるHigh DPI には、コントロールの文字がぼけるだけでなく、クリップボードにコピーした画像を PictureBox に表示すると何故か拡大されてしまう、という問題*1もあります。

解消方法

プロジェクトにアプリケーション・マニフェストファイルを追加します。*2

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="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

こうすると、
f:id:jirolabo:20150115234224p:plain
きれいに表示されるようになりました。
先ほど書いた画像の拡大問題も発生しなくなります。