この記事は公開から4年以上経過しています。
Windows10のディスプレイ設定でスケーリング(拡大縮小とレイアウト)を変更していると、WinForms(+WPFユーザーコントロール)アプリケーションのレイアウトが崩れることがある問題への対応。
問題
高DPI対応されていないWinFormsアプリケーションをWindows10のスケーリング機能で拡大縮小表示する場合にはDPI仮想化機能でピクセルが伸縮されるが、WinFormsにWPFユーザーコントロールを配置したケースなどでDPI仮想化が行なわれずレイアウトが崩れてしまう場合がある。
原因
プログラム側が非DPI認識を明示しないことにより、高DPI対応アプリケーションとして扱われる。
対応
タスクマネージャーの詳細
からプロセスのDPI対応
が非対応
になっているかを確認し、なっていない場合には、プロジェクトのmanifestファイルを使いdpiAware
設定を明示的にfalse
に指定する。
DPI仮想化を想定している場合に問題が発生するケース
DPI仮想化を想定している場合でも問題が発生しないケース
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
のままで問題なし。
参考ウェブサイトなど
- Microsoft Docs
Setting the default DPI awareness for a process
以上です。