自動スケーリングを使用すると、特定のディスプレイ解像度またはフォントを持つ 1 台のコンピューターで設計されたフォームとそのコントロールを、別のコンピューターで別のディスプレイ解像度またはフォントで適切に表示できます。 これにより、フォームとそのコントロールのサイズが、ユーザーと他の開発者の両方のコンピューター上のネイティブ ウィンドウや他のアプリケーションと一致するようにインテリジェントにサイズ変更されます。 自動スケーリングとビジュアル スタイルにより、Windows フォーム アプリケーションは、各ユーザーのコンピューター上のネイティブ Windows アプリケーションと比較して、一貫した外観を維持できます。
ほとんどの場合、自動スケーリングは Windows フォームで想定どおりに動作します。 ただし、フォント パターンの変更は問題になる可能性があります。 これを解決する方法の例については、「方法: Windows フォーム アプリケーションのフォント パターンの変更に応答する」を参照してください。
自動スケーリングの必要性
自動スケーリングを使用しない場合、1 つのディスプレイ解像度またはフォント用に設計されたアプリケーションは、その解像度またはフォントが変更されたときに表示が小さすぎるか、大きすぎます。 たとえば、アプリケーションがベースラインとして Tahoma 9 ポイントを使用して設計されている場合、システム フォントが Tahoma 12 ポイントであるコンピューターで実行すると、調整なしでは小さすぎます。 タイトル、メニュー、テキスト ボックスの内容などのテキスト要素は、他のアプリケーションよりも小さくレンダリングされます。 さらに、タイトル バー、メニュー、および多くのコントロールなどのテキストを含むユーザー インターフェイス (UI) 要素のサイズは、使用されるフォントに依存します。 この例では、これらの要素も比較的小さく表示されます。
類似の状況は、アプリケーションが特定のディスプレイ解像度用に設計されている場合に発生します。 最も一般的なディスプレイ解像度は 96 ドット/インチ (DPI) であり、100% ディスプレイスケーリングに相当しますが、125%、150%、200% (それぞれ 120、144、192 DPI) 以上をサポートする高解像度ディスプレイがより一般的になっています。 調整を行わないと、1 つの解像度用に設計されたアプリケーション 、特にグラフィックス ベースのアプリケーションは、別の解像度で実行すると大きすぎるか小さすぎます。
自動スケーリングでは、相対フォント サイズまたは表示解像度に従ってフォームとその子コントロールのサイズを自動的に変更することで、これらの問題に対処します。 Windows オペレーティング システムでは、ダイアログ 単位と呼ばれる相対的な測定単位を使用したダイアログ ボックスの自動スケーリングがサポートされています。 ダイアログ ユニットはシステム フォントに基づいており、Win32 SDK 関数 GetDialogBaseUnits
がピクセルとの関係を決定できます。 ユーザーが Windows で使用するテーマを変更すると、それに応じてすべてのダイアログ ボックスが自動的に調整されます。 さらに、Windows フォームでは、既定のシステム フォントまたは表示解像度に従った自動スケーリングがサポートされています。 必要に応じて、アプリケーションで自動スケーリングを無効にすることができます。
注意事項
DPI モードとフォント スケーリング モードの任意の組み合わせはサポートされていません。 1 つのモード (DPI など) を使用してユーザー コントロールをスケーリングし、別のモード (Font) を使用してフォームに配置することもできますが、基本フォームを 1 つのモードで混在させ、派生フォームを別のモードに混在させると、予期しない結果が発生する可能性があります。
自動スケーリングが機能している
Windows フォームでは、次のロジックを使用して、フォームとその内容を自動的にスケーリングします。
設計時に、各 ContainerControl はスケーリング モードと現在の解像度をそれぞれ AutoScaleMode および AutoScaleDimensionsに記録します。
実行時に、実際の解像度は CurrentAutoScaleDimensions プロパティに格納されます。 AutoScaleFactor プロパティは、実行時とデザイン時のスケーリングの解像度の比率を動的に計算します。
フォームの読み込み時に、CurrentAutoScaleDimensions と AutoScaleDimensions の値が異なる場合は、PerformAutoScale メソッドを呼び出してコントロールとその子をスケーリングします。 このメソッドはレイアウトを中断し、Scale メソッドを呼び出して実際のスケーリングを実行します。 その後、プログレッシブ スケーリングを回避するために、AutoScaleDimensions の値が更新されます。
PerformAutoScale は、次の状況でも自動的に呼び出されます。
スケーリング モードが OnFontChangedされている場合は、Font イベントに応答します。
コンテナー コントロールのレイアウトが再開され、AutoScaleDimensions プロパティまたは AutoScaleMode プロパティで変更が検出された場合。
上記に示すように、親の ContainerControl がスケーリングされたとき。 各コンテナー コントロールは、親コンテナーからのスケーリング ファクターではなく、独自のスケーリング ファクターを使用してその子のスケーリングを担当します。
子供コントロールは、いくつかの方法でそのスケーリングの動作を変更することができます。
ScaleChildren プロパティをオーバーライドして、子コントロールをスケーリングすべきかどうかを決定することができます。
GetScaledBounds メソッドをオーバーライドして、コントロールのスケールの範囲を調整できますが、スケーリング ロジックは調整できません。
ScaleControl メソッドをオーバーライドして、現在のコントロールのスケーリング ロジックを変更できます。
こちらも参照ください
.NET Desktop feedback