Vista で MDI フレーム親子を最大化すると隙間ができる

f:id:dacci:20110219171822p:image:right
MDI アプリを作って動かしてたら、親フレームと子フレームを同時に最大化したときに、右端に変な隙間ができてるのに気づいた。
他の MDI アプリでも同じように隙間ができるので、自分の所為じゃなさそうだと思って調べてみたら、「高 DPI 対応」じゃないとそうなってしまうらしい。全然知らなかった。


細かいところは 高 DPI 対応の Win32 アプリケーションを記述する を参照してもらうとして、要は「高 DPI 対応」だと言い張ってやればいい*1。そのためには、アプリケーション マニフェストに以下のような宣言を追加する。

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

f:id:dacci:20110219171823p:image:right
Visual Studio なら、マニフェスト ツール追加のマニフェスト ファイルとして指定すればいい。

SetProcessDPIAware という API もあるけど、そもそも非推奨だし、Vista 以降にしかないので LoadLibraryGetProcAddrees が必要。

ちなみに、他の MDI アプリもアプリケーション マニフェストを用意してやればちゃんと最大化されるようになると思う。

*1:ホントはもっと厳密やらないとネ