今回は、コントロールとテーマの関係について取り上げます。次の図を見てください。これまで作成したアプリケーションでは、右のウインドウのように表示されていたと思われます。コントロールにはテーマが適応されていません。この問題を解決するためには、描画の際にどのようなDLLが使われているのかを理解する必要があります。ウインドウの非クライアント領域の描画は、user32.dllを通じて行われます。非クライアント領域はテーマの状態が常に反映されることになります。コントロールの描画は、comctl32.dllを通じて行われます。後者のDLLを使用した場合はテーマを考慮してコントロールが描画されます。これを6系列の使用に変更すれば、コントロールにテーマを適応させることができるはずです。描画にはバージョン5系列のcomctl32.dllが使用されていると思われます。任意のバージョンのDLLを使用するためには、アプリケーションにマニフェストファイルを追加する必要があります。マニフェストファイルには、使用するDLL(正確にはアセンブリ)の名前やバージョンを指定できます。次に、バージョン6系列のcomctl32.dllを使用する場合におけるマニフェストファイルの形式を示します。</dependentAssembly></dependency></assembly>青字以外の部分は、変更する必要はありません。nameは、アプリケーションの名前を指定します。descriptionは、アプリケーションの説明文を指定します。マニフェストファイルの名前は、EXEファイルの名前に.manifestを追加したものになります。EXEファイルの名前がsample.exeならば、sample.exe.manifestのようになります。ファイルの中身については、上記コードをコピーして貼り付けるだけで問題ありません。プロジェクトのプロパティから追加する方法もよく利用されます。次にこの手順を示します。ファイル」に$(ProjectDir)\$(TargetFileName).manifestという文字列を入力します。マニフェストファイルは、予めプロジェクトフォルダに置いておきます。これでOKボタンを押してビルドすれば、EXEファイルにはマニフェストファイルが埋め込まれることになります。バージョン6系列のcomctl32.dllを使用するという点だけであることに注意してください。当然ながらコントロールにテーマは反映されません。コントロールの新しい機能を使用できるようになることがあります。Vistaのボタンならシールドアイコンを備えたり、分割ボタンやコマンドリンクボタンを作成したりすることができます。これらのボタンを作成する例を次に示します。(LPARAM)L"任意の文章を表示できます。TEXT("矢印が選択されました。その後にBCM_SETSHIELDというメッセージを送っています。第4引数にTRUEを指定すると実際にアイコンが設定されます。シールドアイコンは、管理者でなければ実行できない動作を伝える場合に使用します。分割ボタンを作成しています。分割ボタンは矢印を持ち、それを選択した場合はWM_NOTIFYでBCN_DROPDOWNが送られます。今回は、ここでMessageBoxを表示していますが、通常はメニューを表示することになります。3つ目のCreateWindowExでは、BS_COMMANDLINKを指定してコマンドリンクボタンを作成しています。コマンドリンクボタンは、BCM_SETNOTEメッセージを通じてボタンにコメントを設定することができます。考えるとこれは少し不思議なことであるといえます。名前の重複によりDLLが共存できないのではないでしょうか。1つのDLL毎に個別の名前を持ったフォルダが作成されることになっています。マニフェストファイルで使用するバージョンを決定できる仕組みをサイドバイサイドアセンブリ共有と呼びます。共有されるDLLはアセンブリと呼ばれます。system32フォルダに存在するcomctl32.dllが使用されることになっています。バージョン5系列のcomctl32.dllは、system32フォルダにもWinSxSフォルダにも存在します。XPでは、バージョン5系列のcomctl32.dllはWinSxSフォルダに存在しません。