1. ホーム
  2. windows

[解決済み] Windowsのフォントのスケーリングが100%以上のとき、GUIをうまく動作させるにはどうしたらいいですか?

2022-10-06 15:20:17

質問

Windows のコントロール パネルで大きなフォント サイズ (125% や 150% など) を選択すると、VCL アプリケーションで、何かがピクセル単位で設定されているたびに問題が発生します。

を使用します。 TStatusBar.Panel . その幅を設定して、ちょうど1つのラベルを含むようにしましたが、大きなフォントではラベルが "overflow"になってしまいます。他のコンポーネントでも同じ問題があります。

Dell の一部の新しいラップトップは、デフォルトで 125% に設定されて出荷されているため、過去にはこの問題は非常にまれでしたが、今では本当に重要な問題です。

この問題を克服するためにできることは何でしょうか?

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

注意: 他の回答には非常に貴重なテクニックが含まれていますので、そちらを参照してください。ここでの私の回答は、DPI を意識することが簡単であると仮定することに対する注意と警告を提供するだけです。

私は一般に、DPI を考慮したスケーリングを TForm.Scaled = True . DPI の認識は、私に電話をかけてきてお金を払ってくれる顧客にとって重要になったときのみ、私にとって重要になります。 その視点の背後にある技術的な理由は、DPI を意識するかしないかで、傷つく世界への窓を開けていることになるからです。 多くの標準およびサードパーティのVCLコントロールは、High DPIではうまく動きません。Windowsコモンコントロールを包むVCLパーツは、High DPIで驚くほどよく動くという顕著な例外があります。 膨大な数のサードパーティとビルトインのDelphi VCLカスタムコントロールは、High DPIではうまく動きませんし、まったく動きません。TForm.Scaled をオンにする場合は、プロジェクト内のすべてのフォーム、および使用するサードパーティ製と組み込みのコントロールのすべてについて、96、125、および 150 DPI でテストすることを忘れないでください。

Delphi 自体は Delphi で書かれています。 ほとんどのフォームで高 DPI を認識するフラグがオンになっていますが、最近でも Delphi XE2 では、IDE 作成者自身が高 DPI 認識マニフェスト フラグをオンにしないことを決定しています。 Delphi XE4 以降では、HIGH DPI 意識フラグがオンになっており、IDE は正常に表示されることに注意してください。

私は、Delphi の組み込みフォーム デザイナーを使用して構築された VCL アプリケーションでは、TForm.Scaled=true (Delphi のデフォルトなので、変更していない限り、ほとんどのフォームは Scaled=true になっています) を High DPI Aware フラグ (David の回答で示されたとおり) とともに使用しないよう提案します。

私は過去に、TForm.Scaled が true で、Delphi のフォーム スケーリングに不具合がある場合に予想される破損の種類の最小限のサンプルを作ろうとしたことがあります。 これらの不具合は、DPI値が96以外の場合にのみ発生するわけではなく、常に発生します。 Windows XPのフォントサイズ変更を含む、他のものの完全なリストを決定することができませんでした。 しかし、これらの不具合のほとんどは、私自身のアプリケーションで、かなり複雑な状況でのみ発生するので、自分で検証できるいくつかの証拠を示すことにしました。

Delphi XE は Windows 7 で DPI Scaling を "Fonts @ 200%" に設定するとこのようになり、Delphi XE2 は Windows 7 と 8 で同様に壊れましたが、これらの不具合は Delphi XE4 の時点で修正されたようです。

Delphi XE4

これらはほとんど、高DPIで誤動作している標準VCLコントロールです。ほとんどのものはまったくスケーリングされていないので、Delphi IDE の開発者は DPI の認識を無視し、DPI 仮想化もオフにすることにしたことに注意してください。 そのような興味深い選択です。

DPI 仮想化をオフにするのは、この新しい追加の痛みの原因、および困難な選択をしたい場合だけです。私は、そのままにしておくことをお勧めします。 Windows の一般的なコントロールは、ほとんど問題なく動作するようであることに注意してください。Delphi のデータ エクスプローラー コントロールは、標準の Windows ツリー共通コントロールの C# WinForms ラッパーであることに注意してください。 これは純粋にマイクロソフトの不具合で、これを修正するには、Embarcaderoがデータエクスプローラのために純粋な.Netネイティブのツリーコントロールを書き直すか、コントロール内の項目の高さを変更するDPIチェック&モディファイプロパティのコードを書かなければならないかもしれません。マイクロソフトのWinFormsでさえ、高DPIをきれいに、自動的に、かつ、カスタムクラッジコードなしで処理することはできません。

更新: Delphi IDE は仮想化されていないように見えますが、David が示したマニフェスト コンテンツを使って非 DPI 仮想化を実現しているわけではありません。おそらく、実行時に何らかの API 関数を使用しているのでしょう。

更新 2: 100%/125% DPI をどのようにサポートするかという質問に対して、私は 2 段階の計画を思いつきました。フェーズ 1 は、高 DPI 用に修正する必要があるカスタム コントロールについて、私のコードを調査し、それらを修正または段階的に削除する計画を立てることです。第2段階は、レイアウト管理なしのフォームとして設計された私のコードの一部を、何らかのレイアウト管理を使用するフォームに変更し、DPIやフォントの高さを変更してもクリッピングが発生しないようにすることです。 このインターコントロールのレイアウト作業は、ほとんどのアプリケーションにおいて、イントラコントロールの作業よりもはるかに複雑であると思われます。

更新しました。 2016年、最新のDelphi 10.1 Berlinは、私の150dpiワークステーションでうまく動作しています。