啟用視覺化樣式

本主題說明如何設定應用程式,以確保一般控制項會顯示在使用者慣用的視覺樣式中。

本主題包含下列各節。

使用資訊清單或指示詞來確保視覺樣式可以套用至應用程式

若要讓應用程式使用視覺化樣式,您必須使用 ComCtl32.dll 6 版或更新版本。 因為第 6 版無法轉散發,所以只有在您的應用程式在包含它的 Windows 版本上執行時才可使用。 Windows隨附于第 5 版和第 6 版。 ComCtl32.dll第 6 版同時包含使用者控制項和一般控制項。 根據預設,應用程式會使用 User32.dll 中定義的使用者控制項,以及 ComCtl32.dll 第 5 版中定義的一般控制項。 如需 DLL 版本及其散發平臺的清單,請參閱 Common Control Versions

如果您想要讓應用程式使用視覺化樣式,您必須新增應用程式資訊清單或編譯器指示詞,指出如果有的話,應該使用ComCtl32.dll第 6 版。

應用程式資訊清單可讓應用程式指定所需的元件版本。 在 Microsoft Win32 中,元件是一組 DLL,以及包含在這些 DLL 內的可版本設定物件清單。

資訊清單是以 XML 撰寫。 應用程式資訊清單檔的名稱是可執行檔的名稱,後面接著副檔名 .manifest;例如,MyApp.exe.manifest。 下列範例資訊清單顯示第一節描述資訊清單本身。 下表顯示資訊清單描述區段中 assemblyIdentity 元素所設定的屬性。

屬性 描述
version 資訊清單的版本。 版本的格式必須是 major.minor.revision.build (,也就是 n.n.n.n,其中 n < =65535) 。
processorArchitecture 開發應用程式的處理器。
NAME 包含公司名稱、產品名稱和應用程式名稱。
類型 您的應用程式類型,例如 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 版

以下是不使用協力廠商延伸模組的應用程式範例。

  • 計算機
  • Windows Vista 和 Windows 7) 中的 FreeCell (
  • Windows Vista 和 Windows 7) 中的 (
  • [記事本]
  • Windows Vista 和 Windows 7) 中的 Solitaire (

若要建立資訊清單,並讓應用程式使用視覺化樣式。

  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"
    

    注意

    當您將上一個專案新增至資源時,您必須將它格式化為一行。 或者,您可以將 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. 將資訊清單新增至應用程式的資源檔作為資源識別碼 123。

注意

當您撰寫主控台應用程式時,請將它放在適當的類別中。 主控台現在支援主控台應用程式的分類。 這表示主控台應用程式可以指派識別碼,並分成工作區域,例如新增或移除程式、外觀和主題,或日期、時間、語言和區域選項。

 

將視覺化樣式支援新增至延伸模組、外掛程式、MMC 貼齊或帶入進程的 DLL

視覺化樣式的支援可以新增至延伸模組、外掛程式、MMC 嵌入式管理單元,或帶入程式的 DLL。 例如,使用下列步驟新增 Microsoft Management Console (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 函式,關閉控制項或視窗中所有控制項的視覺化樣式,如下所示:

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

在上一個範例中, hwnd 是停用視覺化樣式之視窗的控制碼。 呼叫之後,控制項會呈現沒有視覺化樣式。

搭配 HTML 內容使用視覺化樣式

修改級聯樣式表的 HTML 頁面 (CSS) 屬性,例如背景或框線,不會套用視覺樣式。 它們會顯示指定的 CSS 屬性。 當指定為內容的一部分時,大部分的 CSS 屬性都會套用至已套用視覺化樣式的專案。

根據預設,視覺樣式會套用至 Microsoft Internet Explorer 6 和更新版本中所顯示頁面上的內建 HTML 控制項。 若要關閉 HTML 頁面的視覺化樣式,請將 META 標籤新增至 區段。 這項技術也適用于封裝為 HTML 應用程式的內容, (HTA) 。 若要關閉視覺化樣式,META 標籤必須如下所示:

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

注意

如果瀏覽器設定和標籤設定不一致,頁面將不會套用視覺化樣式。 例如,如果 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 的高對比中正確轉譯。
  • 如果您使用第 6 版ComCtl32.dll的功能,例如磚檢視或連結控制項,則必須處理使用者電腦上無法使用這些控制項的情況。 ComCtl32.dll第 6 版無法轉散發。
  • 測試您的應用程式,以確定您不依賴第 6 版ComCtl32.dll的功能,而不需要先檢查目前的版本。
  • 請勿連結至 UxTheme.lib。
  • 當視覺化樣式未如預期般運作時,請為 實例撰寫錯誤處理常式代碼。
  • 在舊版中安裝應用程式的資訊清單不會影響控制項的轉譯。

視覺化樣式