Delphi 6 で XP Style に対応する

Delphi 7 以降を買えという気もしますが,未だに Delphi 6 Personal 版を愛用している人もいるかと。

俗に manifest 書けばできるよ(⇒ Windows XP の Luna スタイルに対応しよう)といわれていますが,TPageControl とか対応してないコントロールがあったり,ちまちまと WS_EX_TRANSPARENT スタイルを指定しても TCheckBox や TRadioBox の背景が塗りつぶされたり,と悲惨な目にあいます。

で,あれこれ面倒をみてくれるのが,Soft Gems の Windows XP Theme Manager (⇒Soft Gems Homepage)です。なんといっても Delphi 7 以降にはこいつが付属した(そして XP Style 対応とした)といわれているくらいなので,お墨付き度満点です。

こいつを使って XP Style 化するには,こいつをインストールしてメインのフォームに TThemeManager をおいて,manifest を用意すれば*1できます。

んでも,実はビジュアルコンポーネントである必要はないんですよね。なので,他所にもっていっても動くプロジェクトソースにすることができます。

プロジェクトディレクトリに

  • ThemeMgr.pas
  • ThemeSrv.pas
  • TmSchema.pas
  • UxTheme.pas
  • Compliers.inc

をコピーして,メインのフォームで下記のようにすれば,実行時に自動的に XP Style を適用してくれます。Delphi 側にインストールしておく必要はありません。

uses
  Forms,
  ThemeMgr;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FThemeManager: TThemeManager;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FThemeManager := TThemeManager.Create(Self);
  FThemeManager.Options := DefaultThemeOptions - [ toSubclassSpeedButtons ];
  FThemeManager.CollectForms();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FThemeManager.Free;
end;

FThemeManager.CollectForms を実行しないと,メインフォームだけ XP Style 対象外になってしまったりしてはまりました。あと TSpeedButton に XP Style が適用された見た目が(個人的に)気にくわなかったので,上記サンプルではそのオプションを外してあります。

ちなみに,実行時パッケージなしで Theme Manager を組み込むと 200KB ほど実行ファイルのサイズが増えますので臨機応変に。

*1:コントロールの整合性をとるため manifest がないと XP style にならないようになってるのです