啟用視覺化樣式

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

本主題包括下列各節。

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

若要讓應用程式使用可視化樣式,您必須使用第 6 版或更新版本ComCtl32.dll。 因為第 6 版無法轉散發,所以只有在您的應用程式在包含它的 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。 下列範例指令清單顯示第一個區段描述指令清單本身。 下表顯示 manifest description 區段中 assemblyIdentity 元素所設定的屬性。

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

 

範例指令清單也會提供應用程式的描述,並指定應用程式相依性。 下表顯示 dependency 區段中 assemblyIdentity 元素所設定的屬性。

屬性 描述
type 相依性元件的類型,例如 Win32。
NAME 元件的名稱。
version 元件的版本。
processorArchitecture 元件所設計的處理器。
publicKeyToken 與這個元件搭配使用的金鑰令牌。
language 元件的語言。

 

以下是指令清單檔的範例。

重要

如果您的應用程式以 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版

以下是不使用第三方擴充功能的應用程式範例。

  • 計算機
  • FreeCell (在 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"
    

    注意

    當您將上一個專案新增至資源時,您必須將它格式化為一行。 或者,您可以將 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 內容使用可視化樣式

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

根據預設,視覺樣式會套用至 Microsoft Internet Explorer 6 和更新版本中所顯示頁面上的內建 HTML 控件。 若要關閉 HTML 頁面的視覺化樣式,請將META標籤新增至 區 <head> 段。 這項技術也適用於封裝為 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。
  • 當視覺樣式無法如預期般運作時,請為實例撰寫錯誤處理程序代碼。
  • 在舊版中安裝應用程式的指令清單不會影響控件的轉譯。

可視化樣式