Windows フォームにおける自動スケーリングAutomatic scaling in Windows Forms

自動スケーリングによって、特定のディスプレイの解像度またはシステムのフォントを持つマシンに合わせて設計されたフォームとコントロールを、ディスプレイの別の解像度やシステム フォントを持つ別のマシンで適切に表示することができます。Automatic scaling enables a form and its controls, designed on one machine with a certain display resolution or system font, to be displayed appropriately on another machine with a different display resolution or system font. フォームとコントロールが、ユーザーとその他の開発者のマシンのネイティブ ウィンドウとその他のアプリケーションで、一貫性を持つよう適切にサイズ変更され、It assures that the form and its controls will intelligently resize to be consistent with native windows and other applications on both the users' and other developers' machines. 自動スケーリングと視覚スタイルに対する .NET Framework.NET Framework のサポートにより、各ユーザーのマシンのネイティブの Windows アプリケーションと比較した場合、.NET Framework.NET Framework アプリケーションが一貫したルック アンド フィールを維持することができます。The support of the .NET Framework.NET Framework for automatic scaling and visual styles enables .NET Framework.NET Framework applications to maintain a consistent look and feel when compared to native Windows applications on each user's machine.

.NET Framework.NET Framework バージョン 2.0 以降では、ほとんどの場合、自動スケーリングは正常に機能します。For the most part, automatic scaling works as expected in .NET Framework.NET Framework version 2.0 and later. ただし、フォント パターンの変更が問題になる可能性があります。However, font scheme changes can be problematic. この問題を解決する方法の例を参照してくださいする方法: Windows フォーム アプリケーションでのフォント パターンの変更に応答です。To see an example of how to resolve this, see How to: Respond to Font Scheme Changes in a Windows Forms Application.

自動スケーリングの必要性Need for automatic scaling

自動スケーリングがないと、1 つのディスプレイの解像度やフォントのために設計されたアプリケーションは、その解像度やフォントが変更されたときに、表示が小さすぎたり大きすぎたりします。Without automatic scaling, an application designed for one display resolution or font will either appear too small or too large when that resolution or font is changed. たとえば、アプリケーションが基準として Tahoma の 9 ポイントを使用して設計されている場合、調整なしでは、システム フォントが Tahoma の 12 ポイントのマシンで実行すると、表示が小さすぎます。For example, if the application is designed using Tahoma 9 point as a baseline, without adjustment it will appear too small if run on a machine where the system font is Tahoma 12 point. タイトル、メニュー、テキスト ボックスの内容などのテキストの要素は、他のアプリケーションより小さく表示されます。Text elements, such as titles, menus, text box contents, and so on will render smaller than other applications. さらに、タイトル バー、メニューや、多数のコントロールのテキストを含むユーザー インターフェイス (UI) 要素のサイズは、使用されるフォントに依存します。Furthermore, the size of user interface (UI) elements that contain text, such as the title bar, menus, and many controls are dependent on the font used. この例では、これらの要素は比較的小さく表示されます。In this example, these elements will also appear relatively smaller.

類似する状況は、アプリケーションがディスプレイの特定の解像度のために設計されている場合にも発生します。An analogous situation occurs when an application is designed for a certain display resolution. 最も一般的なディスプレイの解像度が 96 ドット/インチ (DPI)、100% ディスプレイのスケーリングと等しい、これが 125%、150%、200% をサポートする高い解像度表示 (どのそれぞれ等しい 120、144 と 192 DPI) 上記のようになっていますより一般的です。The most common display resolution is 96 dots per inch (DPI), which equals 100% display scaling, but higher resolution displays supporting 125%, 150%, 200% (which respectively equal 120, 144 and 192 DPI) and above are becoming more common. 調整なしだと、特にグラフィックスに基づくアプリケーションで、ある解像度のために設計されたものが、別の解像度で実行したときに、表示が大きすぎたり小さすぎたりします。Without adjustment, an application, especially a graphics-based one, designed for one resolution will appear either too large or too small when run at another resolution.

自動スケーリングは、相対的なフォント サイズやディスプレイ解像度に従ってフォームと子コントロールを自動でサイズ変更することで、これらの問題を改善しようとしています。Automatic scaling seeks to ameliorate these problems by automatically resizing the form and its child controls according to the relative font size or display resolution. Windows オペレーティング システムは、ダイアログ単位と呼ばれるは、相対的な測定単位を使用して、ダイアログ ボックスの自動スケーリングをサポートします。The Windows operating system supports automatic scaling of dialog boxes using a relative unit of measurement called dialog units. ダイアログ単位は、システム フォントに基づいており、ピクセルとの関係は、Win32 SDK 関数 GetDialogBaseUnits によって決定できます。A dialog unit is based on the system font and its relationship to pixels can be determined though the Win32 SDK function GetDialogBaseUnits. ユーザーが Windows によって使用されるテーマを変更すると、すべてのダイアログ ボックスがそれに合わせて自動的に調整されます。When a user changes the theme used by Windows, all dialog boxes are automatically adjusted accordingly. さらに、.NET Framework.NET Frameworkのいずれか、既定のシステム フォントまたはディスプレイの解像度に応じて、自動スケーリングをサポートします。In addition, the .NET Framework.NET Framework supports automatic scaling either according to the default system font or the display resolution. 必要に応じて、アプリケーションで自動スケーリングを無効化できます。Optionally, automatic scaling can be disabled in an application.

自動スケーリングの元のサポートOriginal support for automatic scaling

.NET Framework.NET Framework のバージョン 1.0 および 1.1 は、Windows の UI に使用される (Win32 SDK 値 DEFAULT_GUI_FONT で表す) 既定のフォントに依存した、簡単な方法で自動スケーリングをサポートしていました。Versions 1.0 and 1.1 of the .NET Framework.NET Framework supported automatic scaling in a straightforward manner that was dependent on the Windows default font used for the UI, represented by the Win32 SDK value DEFAULT_GUI_FONT. このフォントは、通常、ディスプレイの解像度が変更されたときにのみ変更されました。This font is typically only changed when the display resolution changes. 自動スケーリングを実装するために、次のメカニズムが使用されていました。The following mechanism was used to implement automatic scaling:

  1. デザイン時は、AutoScaleBaseSize プロパティ (これは現在非推奨とされます) が、開発者のマシンの既定のシステム フォントの高さと幅に設定されていました。At design time, the AutoScaleBaseSize property (which is now deprecated) was set to the height and width of the default system font on the developer's machine.

  2. 実行時は、ユーザーのマシンの既定のシステム フォントが Form クラスの Font プロパティを初期化するために使用されていました。At runtime, the default system font of the user's machine was used to initialize the Font property of the Form class.

  3. フォームを表示する前に、フォームのスケーリングのため、ApplyAutoScaling メソッドが呼び出されました。Before displaying the form, the ApplyAutoScaling method was called to scale the form. このメソッドは、AutoScaleBaseSizeFont から相対スケール サイズを計算し、Scale メソッドを呼び出してフォームとその子を実際にスケーリングしました。This method calculated the relative scale sizes from AutoScaleBaseSize and Font then called the Scale method to actually scale the form and its children.

  4. ApplyAutoScaling への後続の呼び出しがフォームを段階的にサイズ変更することがないよう、AutoScaleBaseSize の値が更新されました。The value of AutoScaleBaseSize was updated so that subsequent calls to ApplyAutoScaling did not progressively resize the form.

このメカニズムは、ほとんどの目的では十分ですが、次の制限がありました。While this mechanism was sufficient for most purposes, it suffered from the following limitations:

  • 以降、AutoScaleBaseSizeプロパティでは、ベースラインのフォント サイズを表す整数値として、丸め誤差が発生するフォームが複数の解像度を循環した場合に顕著に表れることです。Since the AutoScaleBaseSize property represents the baseline font size as integer values, rounding errors occur that become evident when a form is cycled through multiple resolutions.

  • 自動スケーリングは Form クラスでのみ実装されており、ContainerControl クラスでは実装されていませんでした。Automatic scaling was implemented in only the Form class, not in the ContainerControl class. その結果、ユーザー コントロールは、それがフォームと同じ解像度で設計されていて、かつデザイン時にそのユーザー コントロールがそのフォームに配置された場合にのみ、正しくスケーリングされるということになっていました。As a result, user controls would scale correctly only when the user control was designed at the same resolution as the form, and it was placed in the form at design time.

  • フォームとその子コントロールの設計作業を複数の開発者によって並行して進めることができたのは、マシンの解像度が同じ場合に限られていました。Forms and their child controls could only be concurrently designed by multiple developers if their machine resolutions were the same. 同じように、フォームの継承は、親フォームに関連付けられている解像度に依存していました。Likewise it also made inheritance of a form dependent on the resolution associated with the parent form.

  • FlowLayoutPanelTableLayoutPanel など、.NET Framework.NET Framework バージョン 2.0 で導入された新しいレイアウト マネージャーと互換性がありません。It is not compatible with the newer layout managers introduced with the .NET Framework.NET Framework version 2.0, such as FlowLayoutPanel and TableLayoutPanel.

  • .NET Compact Framework.NET Compact Framework への互換性に必要なディスプレイの解像度に直接基づくスケーリングをサポートしていませんでした。It did not support scaling based directly on the display resolution that is required for compatibility to the .NET Compact Framework.NET Compact Framework.

このメカニズムは、.NET Framework.NET Framework バージョン 2.0 で後方互換性のために保持されますが、次に説明するより堅牢なスケーリング メカニズムによって置き換えられました。Although this mechanism is preserved in the .NET Framework.NET Framework version 2.0 to maintain backward compatibility, it has been superseded by the more robust scaling mechanism described next. その結果、AutoScaleApplyAutoScalingAutoScaleBaseSize、および特定の Scale のオーバーロードは廃止マークが付けられています。As a consequence, the AutoScale, ApplyAutoScaling, AutoScaleBaseSize, and certain Scale overloads are marked as obsolete.

注意

従来のコードを .NET Framework.NET Framework バージョン 2.0 にアップグレードする際、これらのメンバーへの参照を削除して問題ありません。You can safely delete references to these members when you upgrade your legacy code to the .NET Framework.NET Framework version 2.0.

自動スケーリングの現在のサポートCurrent support for automatic scaling

.NET Framework.NET Framework バージョン 2.0 は、Windows フォームの自動規スケーリングに次の変更を導入することで、以前の制限を解消しています。The .NET Framework.NET Framework version 2.0 surmounts previous limitations by introducing the following changes to the automatic scaling of Windows Forms:

  • スケーリングの基本サポートは ContainerControl クラスに移動し、フォーム、ネイティブの複合コントロールおよびユーザー コントロールは、すべて統一されたスケーリングのサポートを受け取ります。Base support for scaling has been moved to the ContainerControl class so that forms, native composite controls and user controls all receive uniform scaling support. 新しいメンバー AutoScaleFactorAutoScaleDimensionsAutoScaleMode、および PerformAutoScale が追加されました。The new members AutoScaleFactor, AutoScaleDimensions, AutoScaleMode and PerformAutoScale have been added.

  • Control クラスにも、スケーリングに参加して同じフォームでのスケーリングの混在をサポートできる新しいメンバーがいくつかあります。The Control class also has several new members that allow it to participate in scaling and to support mixed scaling on the same form. 具体的には、ScaleScaleChildren、および GetScaledBounds メンバーが、スケーリングをサポートします。Specifically the Scale, ScaleChildren, and GetScaledBounds members support scaling.

  • 画面の解像度に基づくスケーリングのサポートが追加され、AutoScaleMode の列挙型により定義されるように、システム フォントのサポートを補完します。Support for scaling based upon the screen resolution has been added to complement system font support, as defined by the AutoScaleMode enumeration. このモードは、アプリケーションの移行を容易にする .NET Compact Framework.NET Compact Framework によりサポートされる、自動スケーリングと互換性があります。This mode is compatible with automatic scaling supported by the .NET Compact Framework.NET Compact Framework enabling easier application migration.

  • FlowLayoutPanelTableLayoutPanel などのレイアウト マネージャーの互換性が、自動スケーリングの実装に追加されています。Compatibility with layout managers such as FlowLayoutPanel and TableLayoutPanel has been added to the implementation of automatic scaling.

  • スケール ファクターが、通常は SizeF 構造を使用する浮動小数点値として表され、エラーの丸めが事実上解決されています。Scaling factors are now represented as floating point values, typically using the SizeF structure, so that rounding errors have been practically eliminated.

注意事項

DPI とフォントのスケーリング モードの任意の混在はサポートされません。Arbitrary mixtures of DPI and font scaling modes are not supported. 1 つのモード (DPI など) を使用してユーザー コントロールのスケールを調整し、別のモード (フォント) を使用してフォームに配置して問題が発生しない場合でも、基底フォームはあるモード、派生フォームは別のモードというように混在させると、予期しない結果が発生することがあります。Although you may scale a user control using one mode (for example, DPI) and place it on a form using another mode (Font) with no issues, but mixing a base form in one mode and a derived form in another can lead to unexpected results.

自動スケーリングの動作Automatic scaling in action

Windows フォームは、次のロジックを使用して、フォームとそのコンテンツを自動的にスケール調整します。Windows Forms now uses the following logic to automatically scale forms and their contents:

  1. デザイン時に、各 ContainerControlAutoScaleModeAutoScaleDimensions にそれぞれスケーリング モードと現在の解像度を記録します。At design time, each ContainerControl records the scaling mode and it current resolution in the AutoScaleMode and AutoScaleDimensions, respectively.

  2. 実行時に、実際の解像度は CurrentAutoScaleDimensions プロパティに格納されます。At run time, the actual resolution is stored in the CurrentAutoScaleDimensions property. AutoScaleFactor プロパティは、実行時と設計時のスケーリング解像度の比率を動的に計算します。The AutoScaleFactor property dynamically calculates the ratio between the run-time and design-time scaling resolution.

  3. フォームが読み込まれたときに、CurrentAutoScaleDimensionsAutoScaleDimensions の値が異なる場合は、PerformAutoScale メソッドが呼び出されてコントロールと子のスケールを調整します。When the form loads, if the values of CurrentAutoScaleDimensions and AutoScaleDimensions are different, then the PerformAutoScale method is called to scale the control and its children. このメソッドはレイアウトを中断し、Scale メソッドを呼び出して実際のスケーリングを実行します。This method suspends layout and calls the Scale method to perform the actual scaling. その後、AutoScaleDimensions の値がプログレッシブ スケーリングを避けるために更新されます。Afterwards, the value of AutoScaleDimensions is updated to avoid progressive scaling.

  4. また、PerformAutoScale は次のような状況でも自動的に呼び出されます。PerformAutoScale is also automatically invoked in the following situations:

    • スケーリング モードが Font の場合の OnFontChanged イベントへの応答。In response to the OnFontChanged event if the scaling mode is Font.

    • コンテナー コントロールのレイアウトが再開され、AutoScaleDimensions プロパティまたは AutoScaleMode プロパティで変更が検出されたとき。When the layout of the container control resumes and a change is detected in the AutoScaleDimensions or AutoScaleMode properties.

    • 上記に示すように、親の ContainerControl がスケーリングされたとき。As implied above, when a parent ContainerControl is being scaled. 各コンテナー コントロールは、親コンテナーからのスケーリング ファクターではなく、独自のスケーリング ファクターを使用してその子のスケーリングを担当します。Each container control is responsible for scaling its children using its own scaling factors and not the one from its parent container.

  5. 子コントロールは、いくつかの方法で、そのスケーリングの動作を変更できます。Child controls can modify their scaling behavior through several means:

    • ScaleChildren プロパティをオーバーライドして、子コントロールをスケーリングすべきかどうかを決定することができます。The ScaleChildren property can be overridden to determine if their child controls should be scaled or not.

    • GetScaledBounds メソッドをオーバーライドして、スケーリングのロジックではなく、コントロールがスケーリングされる両機にを調整することができます。The GetScaledBounds method can be overridden to adjust the bounds that the control is scaled to, but not the scaling logic.

    • ScaleControl メソッドをオーバーライドして、現在のコントロールのスケーリングのロジックを変更することができます。The ScaleControl method can be overridden to change the scaling logic for the current control.

関連項目See also

AutoScaleMode
Scale
PerformAutoScale
AutoScaleDimensions
visual スタイルが使用されているコントロールのレンダリングRendering Controls with Visual Styles
方法: 自動スケーリングを解除してパフォーマンスを向上させるHow to: Improve Performance by Avoiding Automatic Scaling