高 DPI グラフィックスに対する VCL スタイルのサポート
RAD Studio 10.4 では、VCL スタイル アーキテクチャが大幅に拡張され、高 DPI グラフィックスおよび 4K モニターをサポートしています。
前のバージョンの RAD Studio では、あるスタイルのすべてのグラフィック要素に対して画像は 1 つであり、指定された要素のサイズに関する特定の情報が持っていました。
現在では、すべてのグラフィック要素は、要素が表示されるモニターの適切な解像度に合わせて自動的にサイズ変更されます。 これはつまり、マルチ モニタ システムの場合、スケーリングはターゲット コンピューターまたは現在のモニターの DPI 解像度に依存することを意味します。
スタイル デザイナは、特定のオブジェクトに対して画像を追加し、異なる解像度を含められるようになりました。
新しい要素の名前は、オブジェクト名 + DPI 情報の慣例の則っており、名前とサイズ情報はアンダースコアで区切られている次の形式となります:
- [name]_15x (150% DPI の場合)
- [name]_20x (200% DPI の場合)
RAD Studio 10.4 では、製品に同梱されている VCL スタイルのほとんどについて、150% および 200% DPI の要素のみを追加しています。
VCL スタイル(*.vsf ファイル)には、固定サイズの要素(矢印や DB ナビゲータ アイコンなど)に、1.5x および 2x のグラフィックスが追加されており、これらはスケーリングされる必要があります。
スタイルのオブジェクト ツリーには、高 DPI グラフィックスにリンク付けされている要素が追加されています。
複数のスタイル イメージによるスケーリングをサポートするスタイルの要素は:
- Form: タイトル ボタン
- CheckBox: グラフィック
- RadioButton: グラフィック
- ScrollBar: 矢印
- ComboBox: ボタン矢印
- TrackBar: 要素
- ControlBar: グリッパ
- StatusBar: グリッパ
- CategoryPanels: 2 重山かっこ
- CategoryButtons: 2 重山かっこ
- DBNavigator: ボタン アイコン
- DBGrid: カーソル アイコン
- MediaPlayer: ボタン アイコン
- SearchEdit: アイコン
更新された高 DPI スタイルのバージョン プロパティは 2.0 です。ビットマップ スタイル デザイナ ツールのルート[オブジェクト]のプロパティを参照してください:
[プロジェクト オプション]ダイアログのスタイル リストの[高 DPI 最適化]セクションで、高 DPI サポートの VCL スタイルを確認することができます。
スタイル API の変更点
概して、スタイル API は完全に改訂されており、最適な DPI の要素をソースとして選択することにより、要素を任意の DPI に自動的に合わせます。たとえば、175% DPI には Arrow_20x を使用します。
さて、スタイル API にスケーリング機能が追加され、スケーリングの要素が自動的に検出されるようになりました。従来のスタイル(高 DPI 要素なし)、および高 DPI をサポートする新しい VCL スタイルで動作します。VCL スタイルに 高 DPI 要素が含まれていない場合、スタイル API は既存の要素をスケーリングします。すべてのメソッドは DPI パラメータができており、これらは VCL スタイル フック クラスで使うためのものです。
高 DPI サポートは、VCL スタイル フック クラスにも追加され、コードのほとんどの部分に改良が加えられています。DPI パラメータは、すべての描画メソッドとシステム測定を検知するためのメソッドに追加されています。特に、TFormStyleHook クラス(TCustomForm に VCL スタイルを適用)は、大幅に改良されました。
新しい 高 DPI スタイル
RAD Studio 10.4 では、新しい高 DPI スタイル モードに対するサポートを提供するために、膨大な数の VCL スタイルが更新されており、次のようなものが含まれます:
- Aqua Light Slate
- Glow
- Iceberg Classico
- Lavender Classico
- SKY
- Slate Classico
- Tablet Dark
- Tablet Light
- Windows 10
- Windows 10 Blue
- Windows 10 Dark
- Windows 10 Green
- Windows 10 Purple
- Windows 10 SlateGray
コントロール単位のタイル
今までは、VCL ライブラリにより、開発者はアプリケーション全体に対してスタイル 1 つ(もしくはスタイルなし)を選択することができました。
10.4 より、単一のアプリケーションの異なる部分に、一度に複数の VCL スタイルを使用することができ、プラットフォーム テーマにデフォルトの要素をいくつかあります。
アプリケーション上の複数のフォームに、それぞれ異なるスタイルを使用できますが、同じフォーム上で異なるビジュアル コントロールも使用することができます。
新しい TControl.StyleName プロパティは、この新しい機能を、その指定されたコントロールのスタイルの名前で制御します。つまり、プロパティが空の場合には、親コントロール スタイルが使用されます。
その名のとおり、コントロール単位スタイルにより、開発者は、同じアプリケーション内にあるコントロールやフォームに対して、異なるスタイルを適用できます。まずはじめに、複数のスタイルをアプリケーションに追加する必要があります。その後、それらすべてが使えるようになります。この機能は、VCL スタイルのいずれかが有効であるときにのみ、機能します。
ここで、5 つの異なるスタイルを使用した 5 つのボタンがあるフォームの例を示します:
VCL アプリケーションのさまざまなフォームやコントロールのスタイルを調整するために使用することができるアプローチは、複数あります:
1. [プロジェクト オプション]でスタイル リストを調整します。
2. TControl.StyleName プロパティを使用して、各コントロールまたは各フォームに対して、特定のスタイルを定義します。StyleName 値は、[プロジェクト]オプションにあるスタイルの名前のいずれかでなければなりません。コントロールは、親コントロールに対して定義されている StyleName を使用することもできます。このため、フォームの StyleName プロパティを設定して、その特定のスタイルを、フォーム上にあるすべてのコントロールに使わせることもできます。
デフォルトでは、TControl.StyleName は空で、コントロールはデフォルト スタイルを使用します。コントロールまたはフォームへのスタイル適用を無効化するには、StyleName を Windows に設定します。読み込まれた VCL スタイルにないスタイル名を設定した場合、コントロールはデフォルト スタイルを使用します。
3. また、特定のスタイルを汎用ダイアログに対して設定することもできます。それにはプロパティ TStyleManager.DialogsStyleName を使用します。デフォルトでは、これは空で汎用ダイアログはアプリケーションのデフォルト スタイルを使用します。
4. アプリケーション スタイルを Windows として定義することができます。つまり、コントロールまたはフォームが空の StyleName プロパティを持っている場合、Windows スタイルと VCL スタイルはそれらに対して常に無効となります。
この機能を有効にするには、TStyleManager.UseSystemStyleAsDefault プロパティを True に設定する必要があります。VCL スタイルをフォームに対してのみ有効にしたい場合、このプロパティを使用し、StyleName プロパティを設定します。ただし、VCL スタイルはどの場合でも有効でなければなりません。
上記の4番で説明されているメカニズムにより、スタイル付きアプリケーション内で、VCL スタイルをサポートしていないサード パーティ製コンポーネントを使用することができます。新しいアーキテクチャでは、スタイル付きとスタイルなしのコントロールやフォームをよりよく混在させて使用することができ、VCL スタイルをあきらめることなく、サードパーティ製コントロールを利用することができます。
スタイル パフォーマンスの向上
VCL スタイルのパフォーマンスを向上させるために、RAD Studio 10.4 はコントロール イメージのビットマップ バッファを利用する機能を追加し、子コントロールはこれを使用して、親のイメージを取得できるようになりました。 コントロールは、すべての親コントロールの描画を呼び出す代わりに、イメージの四角形をこのバッファからコピーします。 この最適化が機能する典型的なシナリオは、複数の TGroupBox を持っており、それぞれの上に TRadio コントロール群がある場合です。
この機能を有効にするには、TStyleManager.UseParentPaintBuffers を True に設定します。
また、VCL スタイルが次の状況でフリッカーを形成する場合、TStyleManager.UseParentPaintBuffers を TRUE に設定します:
- TPanel のべベルとキャプション。
- TGraphicControl のサブタイプ(TPanels での TSplitter、TLabel、TImage など)。
- 水平スプリッターを上に移動したときの TListBox。
- 水平スクロール ボタンの PageControl。