自動スケーリング (Windows フォーム .NET)

自動スケーリングによって、特定のディスプレイの解像度またはフォントを持つマシンに合わせて設計されたフォームとコントロールを、ディスプレイの別の解像度やフォントを持つ別のマシンで適切に表示することができます。 フォームとコントロールが、ユーザーとその他の開発者のマシンのネイティブ ウィンドウとその他のアプリケーションで、一貫性を持つよう適切にサイズ変更され、 自動スケーリングと視覚スタイルにより、各ユーザーのマシンのネイティブの Windows アプリケーションと比較した場合、Windows フォーム アプリケーションが一貫したルック アンド フィールを維持することができます。

ほとんどの場合、自動スケーリングは Windows フォームで期待どおりに機能します。 ただし、フォント パターンの変更が問題になる可能性があります。

重要

.NET 7 と .NET 6 用のデスクトップ ガイド ドキュメントは作成中です。

自動スケーリングの必要性

自動スケーリングがないと、1 つのディスプレイの解像度やフォントのために設計されたアプリケーションは、その解像度やフォントが変更されたときに、表示が小さすぎたり大きすぎたりします。 たとえば、アプリケーションが基準として Tahoma の 9 ポイントを使用して設計されている場合、調整なしでは、システム フォントが Tahoma の 12 ポイントのマシンで実行すると、表示が小さすぎます。 タイトル、メニュー、テキスト ボックスの内容などのテキストの要素は、他のアプリケーションより小さく表示されます。 さらに、タイトル バー、メニューや、多数のコントロールのテキストを含むユーザー インターフェイス (UI) 要素のサイズは、使用されるフォントに依存します。 この例では、これらの要素は比較的小さく表示されます。

類似する状況は、アプリケーションがディスプレイの特定の解像度のために設計されている場合にも発生します。 最も一般的な表示解像度は 96 ドット/インチ (DPI) (100% のディスプレイ スケーリングに相当) ですが、125%、150%、200% (それぞれ 120、144、192 DPI に相当) 以上をサポートするより高解像度なディスプレイも普及し始めています。 調整なしだと、特にグラフィックスに基づくアプリケーションで、ある解像度のために設計されたものが、別の解像度で実行したときに、表示が大きすぎたり小さすぎたりします。

自動スケーリングは、相対的なフォント サイズやディスプレイ解像度に従ってフォームと子コントロールを自動でサイズ変更することで、これらの問題に対処しようとしています。 Windows オペレーティング システムは、ダイアログ単位と呼ばれるは、相対的な測定単位を使用して、ダイアログ ボックスの自動スケーリングをサポートします。 ダイアログ単位は、システム フォントに基づいており、ピクセルとの関係は、Win32 SDK 関数 GetDialogBaseUnits によって決定できます。 ユーザーが Windows によって使用されるテーマを変更すると、すべてのダイアログ ボックスがそれに合わせて自動的に調整されます。 さらに、Windows フォームは、既定のシステム フォントまたはディスプレイの解像度のいずれかに応じて自動スケーリングをサポートしています。 必要に応じて、アプリケーションで自動スケーリングを無効化できます。

注意事項

DPI とフォントのスケーリング モードの任意の混在はサポートされません。 1 つのモード (DPI など) を使用してユーザー コントロールのスケールを調整し、別のモード (フォント) を使用してフォームに配置して問題が発生しない場合でも、基底フォームはあるモード、派生フォームは別のモードというように混在させると、予期しない結果が発生することがあります。

動作中の自動スケーリング

Windows フォームは、次のロジックを使用して、フォームとそのコンテンツを自動的にスケール調整します。

  1. デザイン時に、各 ContainerControlAutoScaleModeAutoScaleDimensions にそれぞれスケーリング モードと現在の解像度を記録します。

  2. 実行時に、実際の解像度は CurrentAutoScaleDimensions プロパティに格納されます。 AutoScaleFactor プロパティは、実行時と設計時のスケーリング解像度の比率を動的に計算します。

  3. フォームが読み込まれたときに、CurrentAutoScaleDimensionsAutoScaleDimensions の値が異なる場合は、PerformAutoScale メソッドが呼び出されてコントロールと子のスケールを調整します。 このメソッドはレイアウトを中断し、Scale メソッドを呼び出して実際のスケーリングを実行します。 その後、AutoScaleDimensions の値がプログレッシブ スケーリングを避けるために更新されます。

  4. また、PerformAutoScale は次のような状況でも自動的に呼び出されます。

    • スケーリング モードが Font の場合の OnFontChanged イベントへの応答。

    • コンテナー コントロールのレイアウトが再開され、AutoScaleDimensions プロパティまたは AutoScaleMode プロパティで変更が検出されたとき。

    • 上記に示すように、親の ContainerControl がスケーリングされたとき。 各コンテナー コントロールは、親コンテナーからのスケーリング ファクターではなく、独自のスケーリング ファクターを使用してその子のスケーリングを担当します。

  5. 子コントロールは、いくつかの方法で、そのスケーリングの動作を変更できます。

    • ScaleChildren プロパティをオーバーライドして、子コントロールをスケーリングすべきかどうかを決定することができます。

    • GetScaledBounds メソッドをオーバーライドして、スケーリングのロジックではなく、コントロールがスケーリングされる両機にを調整することができます。

    • ScaleControl メソッドをオーバーライドして、現在のコントロールのスケーリングのロジックを変更することができます。

関連項目