高DPI環境でWinFormsのレイアウトが崩れる問題の解決方法

この記事は公開から4年以上経過しています。

Windows10のディスプレイ設定でスケーリング(拡大縮小とレイアウト)を変更していると、WinForms(+WPFユーザーコントロール)アプリケーションのレイアウトが崩れることがある問題への対応。


問題

高DPI対応されていないWinFormsアプリケーションをWindows10のスケーリング機能で拡大縮小表示する場合にはDPI仮想化機能でピクセルが伸縮されるが、WinFormsにWPFユーザーコントロールを配置したケースなどでDPI仮想化が行なわれずレイアウトが崩れてしまう場合がある。


原因

プログラム側が非DPI認識を明示しないことにより、高DPI対応アプリケーションとして扱われる。


対応

タスクマネージャーの詳細からプロセスのDPI対応非対応になっているかを確認し、なっていない場合には、プロジェクトのmanifestファイルを使いdpiAware設定を明示的にfalseに指定する。

DPI仮想化を想定している場合に問題が発生するケース

file

DPI仮想化を想定している場合でも問題が発生しないケース

file

DPI認識を無効化してDPI仮想化を有効にするマニフェストファイルの設定

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>
  </windowsSettings>
</application>

※DPI仮想化のときはフォームなどのAutoScaleModeは既定値Fontのままで問題なし。


参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする