共用方式為


啟用可視化樣式

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

本主題包含下列各節。

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

若要讓應用程式使用可視化樣式,您必須使用第 6 版或更新版本 ComCtl32.dll。 因為第 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 元素所設定的屬性。

屬性 描述
版本 清單文件的版本。 版本的格式必須是 major.minor.revision.build (也就是 n.n.n.n,其中 n <=65535)。
處理器架構 您的應用程式為哪個處理器開發。
名字 包含公司名稱、產品名稱和應用程式名稱。
類型 應用程式的類型,例如 Win32。

 

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

屬性 描述
類型 相依性元件的類型,例如 Win32。
名字 元件的名稱。
版本 元件的版本。
處理器架構 元件所設計的處理器。
公鑰令牌 (publicKeyToken) 與這個元件搭配使用的金鑰令牌。
語言 元件的語言。

 

以下是清單檔案的範例。

重要

如果您的應用程式以 32 位 Windows 平臺為目標,請將 processorArchitecture 項目設定為 “X86”,或設定為 “amd64” 如果您的應用程式以 64 位 Windows 平台為目標。 您也可以指定 “*”,以確保所有平台為目標,如下列範例所示。

 

<?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. 在您的 snap-in 原始碼中包含通用控制項頭檔。

    #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 屬性都會套用至已套用可視化樣式的專案。

根據預設,視覺樣式會套用至 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。
  • 當視覺樣式無法如預期般運作時,請為實例撰寫錯誤處理程序代碼。
  • 在舊版中安裝應用程式的指令清單不會影響控件的轉譯。

可視化樣式