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 ほど実行ファイルのサイズが増えますので臨機応変に。