1. ホーム
  2. c#

DPIに対応したアプリケーションの作成

2023-09-08 19:19:54

質問

C#でフォームアプリケーションを作っています。モニターのDPIを変更すると、すべてのコントロールが動きます。 私はコードを使用しました this.AutoScaleMode = AutoScaleMode.Dpi を使用しましたが、問題を回避することはできませんでした。

どなたか思い当たる方はいらっしゃいますか?

どのように解決するのですか?

編集: .NET 4.7 では、Windows フォームで高 DPI のサポートが改善されました。 docs.microsoft.com で詳細をご覧ください。 ただし、Win 10 Creators Update 以上でしか動作しないので、ユーザー ベースによってはまだ使用できないかもしれません。


難しいですが、不可能ではありません。最良の選択肢はもちろん WPF に移行することですが、それは実現不可能かもしれません。

私はこの問題で多くの時間を費やしてきました。ここでは、FlowLayoutPanel または TableLayoutPanel なしで正しく動作させるためのいくつかのルール/ガイドラインを紹介します。

  • アプリは常にデフォルトの 96 DPI (100%) で編集/デザインしてください。120DPI (125% など) で設計すると、後で 96 DPI に戻って作業するときに、非常に具合が悪くなります。
  • 私は AutoScaleMode.Font を使用して成功しましたが、AutoScaleMode.DPI はあまり試したことがありません。
  • すべてのコンテナー (フォーム、パネル、タブページ、ユーザーコントロールなど) でデフォルトのフォント サイズを使用することを確認します。8,25 px です。できれば、コンテナー クラスのデフォルト フォントを使用するように、すべてのコンテナーについて .Designer.cs ファイルで設定しないようにしてください。
  • すべてのコンテナ が必要です。 は同じ オートスケールモード
  • すべてのコンテナで、Designer.cs ファイルに以下の行が設定されていることを確認します。

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); // for design in 96 DPI

  • ラベルやテキストボックスなどに異なるフォントサイズを設定する必要がある場合、コンテナクラスでフォントを設定するのではなく、コントロールごとに設定してください。フォームとフォーム上のすべてのコンテナが同じフォントサイズを使用する場合は、動作するかもしれませんが、私はそれを試していません。
  • 高い DPI 設定を持つ別のマシンまたは仮想 Windows インストール (VMware、Virtual PC、VirtualBox) を使用して、デザインをすぐにテストしてください。DEV マシン上の /bin/Debug フォルダからコンパイルされた .exe ファイルを実行するだけです。

これらのガイドラインに従えば、特定のアンカーでコントロールを配置し、フローパネルを使用しない場合でも、問題がないことを保証します。私たちは、この方法で構築されたアプリをさまざまな DPI 設定の何百台ものマシンに展開していますが、もはや苦情は一切ありません。すべてのフォーム、コンテナ、グリッド、ボタン、テキストフィールドなどのサイズは、フォントと同様に正しく拡大縮小されます。画像も動作しますが、高 DPI では少しピクセルのようになる傾向があります。

編集: このリンクには、特に AutoScaleMode.DPI を使用する場合、多くの良い情報があります。 関連する stackoverflow の質問へのリンク