視覚スタイルを有効にする

このトピックでは、ユーザーが設定した視覚スタイルで共通コントロールが表示されるように、アプリケーションを構成する方法について説明します。

このトピックは次のセクションで構成されます。

マニフェストまたはディレクティブを使用して視覚スタイルをアプリケーションに適用する

アプリケーションで視覚スタイルを使用できるようにするには、ComCtl32.dll のバージョン 6 以降を使用する必要があります。 バージョン 6 は再頒布可能パッケージではないため、この DLL が含まれる Windows のバージョンでアプリケーションが実行される場合にのみ使用できます。 Windows には、バージョン 5 とバージョン 6 の両方が付属しています。 ComCtl32.dll バージョン 6 には、ユーザー コントロールと共通コントロールの両方が含まれます。 既定では、User32.dll で定義されるユーザー コントロールと、ComCtl32.dll バージョン 5 で定義される共通コントロールが、アプリケーションで使用されます。 DLL バージョンとその配布プラットフォームの一覧については、「共通コントロールのバージョン」を参照してください。

アプリケーションで視覚スタイルを使用する場合は、アプリケーション マニフェストまたはコンパイラ ディレクティブを追加して、ComCtl32.dll バージョン 6 が使用可能な場合は使用するよう指定する必要があります。

アプリケーション マニフェストを使用すると、アプリケーションで必要なアセンブリのバージョンを指定できます。 Microsoft Win32 では、アセンブリとは、DLL のセットと、それらの DLL 内に含まれるバージョン管理可能なオブジェクトの一覧です。

マニフェストは XML で記述されます。 アプリケーション マニフェスト ファイルの名前は、実行可能ファイルの名前の後にファイル名拡張子 .manifest を付加したものです。たとえば、MyApp.exe.manifest となります。 次のサンプル マニフェストは、最初のセクションはマニフェスト自体の説明であることを示しています。 次の表に、マニフェストの説明セクションで assemblyIdentity 要素によって設定される属性を示します。

属性 説明
version マニフェストのバージョン。 バージョンは、メジャー.マイナー.リビジョン.ビルドの形式 (つまり n.n.n.n の形式で n <=65535) である必要があります。
processorArchitecture アプリケーションの開発で意図されているプロセッサー。
name 会社名、製品名、アプリケーション名が含まれます。
type アプリケーションの種類 (Win32 など)。

 

このサンプル マニフェストでは、アプリケーションの説明と共に、アプリケーションの依存関係も指定しています。 次の表に、マニフェストの依存関係セクションで assemblyIdentity 要素によって設定される属性を示します。

属性 説明
type 依存関係のあるコンポーネントの種類 (Win32 など)。
name コンポーネント名。
version コンポーネントのバージョン。
processorArchitecture コンポーネントの設計で意図されているプロセッサー。
publicKeyToken このコンポーネントで使用されるキー トークン。
言語 コンポーネントの言語。

 

マニフェスト ファイルの例を以下に示します。

重要

アプリケーションが 32 ビット Windows プラットフォームをターゲットとする場合は、processorArchitecture エントリを "X86" に設定します。アプリケーションが 64 ビット Windows プラットフォームをターゲットとする場合は、"amd64" に設定します。 次の例に示すように、"*" を指定することもできます。これにより、すべてのプラットフォームがターゲットとなります。

 

<?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="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Microsoft Visual C++ 2005 以降を使用している場合は、マニフェストを手動で作成する代わりに、次のコンパイラ ディレクティブをソース コードに追加できます。 読みやすくするために、ここではディレクティブを複数の行に分割しています。

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

これ以降のトピックでは、さまざまな種類のアプリケーションに視覚スタイルを適用する手順について説明します。 どの場合も、マニフェストの形式は同じであることに注意してください。

標準の拡張機能のみを使用するアプリケーションで ComCtl32.dll バージョン 6 を使用する

以下は、サードパーティの拡張機能を使用しないアプリケーションの例です。

  • Calculator
  • フリーセル (Windows Vista および Windows 7)
  • マインスイーパー (Windows Vista および Windows 7)
  • メモ帳
  • ソリティア (Windows Vista および Windows 7)

マニフェストを作成し、アプリケーションで視覚スタイルを使用できるようにするには。

  1. ComCtl32.lib にリンクし、InitCommonControls を呼び出します。

  2. YourApp.exe.manifest という名前のファイルを、XML マニフェスト形式のソース ツリーに追加します。

    <?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="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. 次のように、マニフェストをアプリケーションのリソース ファイルに追加します。

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
    

    Note

    前のエントリをリソースに追加するときは、1 行になるように整形する必要があります。 または、アプリケーションの実行可能ファイルと同じディレクトリに XML マニフェスト ファイルを配置することもできます。 オペレーティング システムは、最初にファイル システムからマニフェストを読み込み、次に実行可能ファイルのリソース セクションをチェックします。 ファイル システムのバージョンが優先されます。

     

アプリケーションをビルドするときに、マニフェストはバイナリ リソースとして追加されます。

コントロール パネルで ComCtl32 バージョン 6 を使用するか、RunDll32.exe によって実行される DLL を使用する

マニフェストを作成し、アプリケーションで視覚スタイルを使用できるようにするには。

  1. ComCtl32.lib にリンクし、InitCommonControls を呼び出します。

  2. YourApp.cpl.manifest という名前のファイルを、XML マニフェスト形式のソース ツリーに追加します。

    <?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="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. マニフェストをリソース ID 123 としてアプリケーションのリソース ファイルに追加します。

Note

コントロール パネル アプリケーションを作成するときは、適切なカテゴリに配置します。 コントロール パネルでは、コントロール パネル アプリケーションのカテゴリがサポートされるようになりました。 つまり、コントロール パネル アプリケーションに識別子を割り当てることで、プログラムの追加と削除、外観とテーマ、日付、時刻、言語、地域のオプションなどのタスク領域に分けることができます。

 

プロセスに読み込まれる拡張機能、プラグイン、MMC スナップイン、または DLL に、視覚スタイルのサポートを追加する

プロセスに読み込まれる拡張機能、プラグイン、MMC スナップイン、DLL に、視覚スタイルのサポートを追加できます。 たとえば、次の手順を使用して、Microsoft 管理コンソール (MMC) スナップイン用に視覚スタイルのサポートを追加します。

  1. DISOLATION_AWARE_ENABLED フラグを使用してスナップインをコンパイルするか、#include "windows.h" ステートメントの前に次のステートメントを挿入します。

    #define ISOLATION_AWARE_ENABLED 1
    

    ISOLATION_AWARE_ENABLED の詳細については、「コンポーネントの分離」を参照してください。

  2. スナップインのソースに共通コントロール ヘッダー ファイルを含めます。

    #include <commctrl.h>
    
  3. YourApp.manifest という名前のファイルを、XML マニフェスト形式を使用したソース ツリーに追加します。

    <?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="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  4. マニフェストをスナップインのリソース ファイルに追加します。 リソース ファイルへのマニフェストの追加の詳細については、「プロセスに読み込まれる拡張機能、プラグイン、DLL を使用するアプリケーションで ComCtl32 バージョン 6 を使用する」を参照してください。

視覚スタイルをオフにする

次のように、SetWindowTheme 関数を呼び出すことで、1 つのコントロール、またはウィンドウ内のすべてのコントロールで視覚スタイルをオフにすることができます。

SetWindowTheme(hwnd, L" ", L" ");

前の例では、 hwnd が、視覚スタイルを無効にするウィンドウのハンドルです。 呼び出し後、コントロールは視覚スタイルなしでレンダリングされます。

HTML コンテンツで視覚スタイルを使用する

背景や罫線などのカスケード スタイル シート (CSS) プロパティを変更する HTML ページには、視覚スタイルが適用されません。 そのようなページでは、指定された CSS 属性が表示されます。 ほとんどの CSS プロパティは、コンテンツの一部として指定されている場合、視覚スタイルが適用されている要素に適用されます。

既定では、Microsoft Internet Explorer 6 以降のバージョンで表示されるページで、組み込みの HTML コントロールに視覚スタイルが適用されます。 HTML ページに対して視覚スタイルをオフにするには、<head> セクションに META タグを追加します。 この手法は、HTML アプリケーション (HTA) としてパッケージ化されたコンテンツにも適用されます。 視覚スタイルをオフにするには、META タグを次のように指定する必要があります。

<META HTTP-EQUIV="MSThemeCompatible" CONTENT="no">

Note

ブラウザーの設定とタグの設定が一致しない場合、そのページに視覚スタイルは適用されません。 たとえば、META タグは "no" に設定されているのに対し、ブラウザーでは視覚スタイルを有効にするように設定されている場合、そのページに視覚スタイルは適用されません。 ただし、ブラウザーまたは META タグのいずれかが "yes" に設定されており、他方の項目が指定されていない場合は、視覚スタイルが適用されます。

 

視覚スタイルによって、コンテンツのレイアウトが変わる可能性があります。 また、ボタンの幅など、組み込みの HTML コントロールに特定の属性を設定すると、特定の視覚スタイルが適用された状態ではボタンのラベルが読み取れない場合があります。

視覚スタイルを使用してコンテンツを十分にテストし、視覚スタイルの適用によってコンテンツとレイアウトに悪影響が生じるかどうかを判断する必要があります。

視覚スタイルが適用されていない場合

トップレベル ウィンドウに視覚スタイルが適用されないようにするには、Null ではない領域 (SetWindowRgn) をウィンドウに設定します。 システムでは、Null ではない領域を持つウィンドウを、視覚スタイルを使用しない特殊なウィンドウと見なします。 視覚スタイルを適用しないトップレベル ウィンドウに関連付けられた子ウィンドウでは、親ウィンドウに適用されていない場合でも視覚スタイルが適用される可能性があります。

アプリケーション内のすべてのウィンドウで、視覚スタイルの使用を無効にする場合は、SetThemeAppProperties を呼び出し、STAP_ALLOW_NONCLIENT フラグを渡さないようにします。 アプリケーションで SetThemeAppProperties 呼び出さない場合に想定されるフラグ値は、STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS | STAP_ALLOW_WEBCONTENT です。 これらの想定される値によって、非クライアント領域、コントロール、および Web コンテンツに視覚スタイルが適用されます。

アプリケーションで以前のバージョンの Windows との互換性を確保する

視覚スタイルのアーキテクチャの多くは、コントロールの外観の変更をサポートしていない以前のバージョンの Windows で製品の出荷を継続しやすくするために設計されています。 複数のオペレーティング システム用にアプリケーションを出荷する場合は、以下の点に注意してください。

  • Windows 8 より前のバージョンの Windows では、ハイ コントラストがオンの場合、視覚スタイルはオフになります。 ハイ コントラストをサポートするには、視覚スタイルをサポートするレガシ アプリケーションで、UI 要素をハイ コントラストで適切に描画するための別個のコード パスを提供する必要があります。 Windows 8 では、ハイ コントラストは視覚スタイルの一部ですが、Windows 8 アプリケーション (アプリケーション マニフェストの互換性セクションに Windows 8 GUID を含むアプリケーション) では、以前の Windows 7 以前のバージョンでもハイ コントラストで正しくレンダリングするための別個のコード パスを提供する必要があります。
  • タイル ビューやリンク コントロールなど、ComCtl32.dll バージョン 6 の機能を使用する場合は、ユーザーのコンピューターでこれらのコントロールを使用できない場合に対処する必要があります。 ComCtl32.dll バージョン 6 は再頒布可能パッケージではありません。
  • アプリケーションをテストして、現在のバージョンを最初にチェックせずに ComCtl32.dll バージョン 6 の機能に依存していないか確認します。
  • UxTheme.lib にリンクしないでください。
  • 視覚スタイルが期待どおりに動作しない場合は、インスタンスのエラー処理コードを記述します。
  • 以前のバージョンにアプリケーションのマニフェストをインストールしても、コントロールのレンダリングには影響しません。

ビジュアル スタイル