マニフェスト


 XPのビジュアルスタイルを使うには、勿論WindowsXP以降のOSが必要になります。WindowsXPにはComCtl32.dllのバージョン5と6が両方入っていて、通常の手順でVC++6.0でアプリケーションを作成するとバージョン5が使用されます。つまりComCtrl32.dllのバージョン6を使うようにしてやればいいのですが、これにはマニフェストを使用します。

 マニフェストはファイルの拡張子が.manifestのファイルです。このファイルをEXEファイルと同じ場所に置いてあげれば、アプリケーションの起動時に読み込まれてXPビジュアルスタイルになります。
 では実際にやってみましょう。まずマニフェストのファイルの中身ですが、以下をコピーしてで書かれた部分を作成するアプリケーションに合わせて書き換えてください。そしてファイル名を○○○.exe.manifestとして保存します。○○○はEXEファイルのファイル名と同じにする必要があります。

<?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="CompanyName.ProductName.YourApp"
    type="win32"
/>
<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>

 あとは作成したマニフェストをEXEファイルと同じ場所置いて、アプリケーションを実行すればXPビジュアルスタイルになっているはずです。


マニフェストをリソースに組み込む


 さて、上記のやり方で確かにXPビジュアルスタイルが適用になったと思いますが、わざわざファイルを置くというのも格好悪い気がします。そこで、マニフェストをリソースに組み込んでしまうことにします。
 とりあえず普通にVC++6.0でプロジェクトを作成すると、resというフォルダが作成されてリソースファイルが置かれます。そこに○○○.rc2という独自にリソースを編集するためのファイルがあるので、これを編集してマニフェストをリソースに組み込みます。
 編集内容は以下の3行を○○○.rc2の最後に追加するだけです。このとき○○○.exe.manifestresフォルダにコピーしておきます。

#define CREATEPROCESS_MANIFEST_RESOURCE_ID      1
#define RT_MANIFEST                             24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST  "res\\○○○.exe.manifest"

 これでビルドすればXPビジュアルスタイルが適用されます。


ソースの修正


 気づいた方も居ると思いますが、ツールバーのグリップ部分がちゃんと描画されていないはずです。これを改善するには、ソースをほんの少し修正する必要があります。修正箇所は以下の2点です。(説明はMFCを使うプロジェクトを作成した場合のものです)

1. アプリケーションクラスのInitInstanceでInitCommonControls()を呼び出す

2. CMainFrame::OnCreate()のツールバーを作成している部分を修正
以下の部分を
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE
    | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS 
    | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
    TRACE0("Failed to create toolbar\n");
    return -1;      // 作成に失敗
}

以下のように修正
if (!m_wndToolBar.CreateEx(this, 0, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
    TRACE0("Failed to create toolbar\n");
    return -1;      // 作成に失敗
}
m_wndToolBar.ModifyStyle( 0, TBSTYLE_FLAT );

 以上で全ての作業は終了です。