RAD Studio / Delphi / C++Builder 10.4 Sydney で追加されたTTitleBarPanel コンポーネント(VCL)を使用することで、モダンなWindowsアプリケーション(Google ChromeやMicrosoft Edgeなど)のように、ウィンドウのタイトルバー部分に検索バー、ボタン、タブなどのカスタムコントロールを配置することができます。このプログでは、以下のHPを基に、その方法を説明します。
カスタムタイトルバーの追加方法
VCLの空のプロジェクトの作成
まず、メニューの「ファイル」-> 「新規作成」-> 「Windows VCL アプリケーション C++Builder」を選択し実行します。

以下のようなVCLの空のプロジェクトを作成されます。このメインフォームのタイトルバーをカスタムタイトルバーに変更してみましょう。

最初に、メニューの「ファイル」-> 「プロジェクトに名前を付けて保存」で、プロジェクトを保存しておきましょう。ここでは、プロジェクト名を「TitleBarPanelT1」としています。

プロジェクトの設定
実行ファイル単体で動作するように、事前にプロジェクトの設定で以下の項目を設定します。
- 「C++リンカ」->「動的RTLとリンクする」 : falseにします。
- 「パッケージ」->「動的パッケージ」->「実行時パッケージを使ってリンク」 : falseにします。
- 「動的RTLとリンクする」 : false

- 実行時パッケージを使ってリンク」 : false

TTitleBarPanelコンポーネントをDrop
パレットから、TTitleBarPanelコンポーネントを選択して、メインフォームにDropします。

CustomTitleBarプロパティの設定
TTitleBarPanelコンポーネントが、タイトルバーの下に配置されています。次に、メインフォームのCustomTitleBarプロパティの設定を変更して、TTitleBarPanelコンポーネントのみの表示にします。
- CustomTitleBar.Control プロパティに、「TitleBarPanel1」(TTitleBarPanelコンポーネント)を選択
- CustomTitleBar.Enabled プロパティをTrueにセット


CustomTitleBar のプロパティ
Formの CustomTitleBarプロパティは、タイトル バーのふるまいを制御するだけでなく、一般的なペイント シナリオ(タイトル バーのキャプションをペイントしない、など)も制御します。これにより、カスタム ペイントをすべて実装しなくても、これらのシナリオを処理することができます。
| CaptionAlignment | キャプションをどこに描画するか指定することができます。Windows 10 では、デフォルトでは左に描画しますが、Windows 8 のように中央にキャプションを描画したり、右揃えにすることもできます。 |
| Control | フォームに配置された TTitleBarPanel に設定します。タイトル バー上のカスタム コントロールについては、以下のセクションを参照してください。 |
| Enabled | カスタム タイトル バーの利用を有効化または無効化します。 |
| Height | タイトル バーの高さをピクセルで表します。タイトル バーの高さを変更するには、タイトル バーをデフォルトのシステムの高さに限定してしまう SystemHeight をオフにします。その後、Height プロパティを任意の値に設定します。 |
| ShowCaption | キャプションを描画するかどうかを制御します。 |
| ShowIcon | フォームのアイコンを、タイトル バーの左端に描画するかどうかを制御します。 |
| SystemHeight | True に設定された場合、タイトル バーの高さは常に、現在の画面で他のウィンドウに使用されている値となります。タイトル バーの高さをカスタマイズするには、SystemHeight を無効にし、その後 Height プロパティに値を入力します。 |
| SystemColors | タイトル バーのキャプションとボタンが、有効または無効の際に、システム色またはカスタム色のどちらを使用するのか制御します。これは、タイトル バーを、システムが使用するのとは異なる背景色および前景色を使用して描画したい場合に、すべてカスタム ペイントをする必要がないため、便利です。 |
| True の場合、背景色、キャプション、システム ボタンは、他のアプリケーションのようにシステム デフォルトの色を使用してペイントします。False の場合、色プロパティ(以下参照)に用意した色が使用されます。 | |
| 使用されるカスタム色については、TTitleBarPanel をフォームに配置し、それに CustomTitleBar.Control プロパティを設定します。たとえタイトル バー パネルが空でコンロトールが何も置かれていなくても、予定しているタイトル バーへのコントロール配置通りに設定してください。 | |
| BackgroundColor ForegroundColor InactiveBackgroundColor InactiveForegroundColor | タイトル バーがペイント時に使用する色を指定するのに使用されます。SystemColors を True に設定すると、これらの値を無視し、現在のシステム デフォルトを使用してペイントします。 |
| ButtonBackgroundColor ButtonForegroundColor ButtonHoverBackgroundColor ButtonHoverForegroundColor ButtonInactiveBackgroundColor ButtonInactiveForegroundColor ButtonPressedBackgroundColor ButtonPressedForegroundColor | カスタム ボタンがあったり、タイトル バーがカスタム描画される際に、システム ボタンによって使用される色を指定します。SystemColors を True に設定すると、これらの値を無視し、現在のシステム デフォルトを使用してペイントします。 |
プロジェクのソースコード
プロジェクのソースコードは、以下からD/Lできます。
カスタムタイトルバーの修正
カスタムタイトルバーに、スピードボタンとTEditコンポーネントを追加してみましょう。
スピードボタンの追加
スピードボタンを追加します。
コンポーネントの追加
TSpeedButtonコンポーネントと、画像を追加するためにTImageCollection、TVirtualImageListコンポーネントをFormにDropし、それからTSpeedButtonコンポーネントを2個 「TitleBarPanel1」にDropします。

TImageCollectionコンポーネント
「ImageCollection1」をダブルクリックして、「画像コレクションエディタ」ダイアログを開きます。「追加」ボタンをクリックして使用する画像を追加します。アイコン画像は、ここから入手しました。入手した画像はPNG画像なので、Jpegに変換後追加しました。

TVirtualImageListコンポーネント
「VirtualImageList1」のオブジェクトインスペクタの「ImageCollection」に、「ImageCollection1」を選択します。

「VirtualImageList1」を、ダブルクリックすると「ImageCollection1」に登録した画像が取り込まれているのが確認できます。

スピードボタンの設定
画像の登録
画像を登録するTSpeedButtonコンポーネントを選択して、そのオブジェクトインスペクタで、以下の設定をします。
- 「Images」プロパティに、「VirtualImageList1」を選択
- 「ImageIndex」プロパティに、「VirtualImageList1」の画像の番号を設定

「Anchors」プロパティの設定
スピードボタンを、システムボタンの左側に配置する場合は、「Anchors」プロパティの「akLeft」をFalse.「akRight」をTrueに設定します。

プロジェクのソースコード
プロジェクのソースコードは、以下からD/Lできます。
参考URL
- VCL アプリでカスタムタイトルバーを作成する – Ray Konopka 氏

