ビジュアルスタイルの適用方法

今更ですが,XPスタイルの適用方法について自分が知っていることをまとめようと思います.
XPスタイルを適用するには,主に次の二つの方法があります.

  • manifest ファイルを自身で作成し,埋め込む.
  • manifest を pragma で埋め込む.

manifest ファイルを自身で作成し,埋め込む

以下のファイルを用意します.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="(name)"
    type="win32"
/>
<description>(description)</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

name と description の部分は,作成しているプログラムに応じて適当に入力します.
次に,上記のファイルの名前を,(hoge).exe.manifest とします.(hoge) の部分は,XPスタイルを適用させたいプログラム名によって決まります.abc.exe に適用させたいのであれば,abc.exe.manifest というファイル名にします.
このファイルを,exe があるプログラムと同じフォルダに置けば完了です.別ファイルとしてではなく,exe のリソースに組み込んで適用させたい場合には,[プロジェクトのプロパティ] - [構成プロパティ] - [マニフェスト ツール] - [入出力] の [追加のマニフェスト ファイル] に manifest ファイル名を指定すれば完了です.コンパイル時に manifest ファイルがリソースに組み込まれるようになります.リソースに組み込んだ場合,同じディレクトリに manifest ファイルを置く必要はありません.
注意事項として,VS2005 以前を使われている場合には,プロパティに上記項目がありませんので,RT_MANIFEST を作成する必要があります.
この方法のメリット・デメリットは以下の通りです.

  • メリット
    • ファイルを置く・置かないでXPスタイルの適用を簡単に切り替えられる.
  • デメリット
    • 実行前,あるいはコンパイル前にファイルを作成する必要がある.

manifest を pragma で埋め込む

以下の pragma をソースコード中に埋め込みます(Windows Vista コモン コントロールの作成要件).

#if defined _M_IX86
# pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
# pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
# pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
# pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

以上で完了です!(プロジェクトの文字セットに Unicode を指定しないといけないと他サイトには書いてありますが,私の環境ではマルチバイトを指定しても動作しました)
この方法のメリット・デメリットは以下の通りです.

  • メリット
    • 64bitなどコード生成したいターゲットプラットフォームに応じて,processorArchitecture の値が自動で変更される.
  • デメリット

以前,InitCommonControls(Ex) を実行するプログラムが(64-bit) 64-bit 環境で起動せず,理由を調べた結果 processorArchitecture が X86 になっていたことが原因でした(正しくは AMD64).
環境に応じて processorArchitecture を変更してくれる 2 番目の方法が個人的におすすめです(手順も簡単です).