啟用視覺化樣式
本主題說明如何設定應用程式,以確保一般控制項會顯示在使用者慣用的視覺樣式中。
本主題包括下列各節。
- 使用指令清單或指示詞來確保視覺樣式可以套用至應用程式
- 在只使用標準擴充功能的應用程式中使用ComCtl32.dll第6版
- 在 控制台 中使用 ComCtl32 第 6 版或由 RunDll32.exe 執行的 DLL
- 將可視化樣式支援新增至延伸模組、外掛程式、MMC 嵌入式管理單元或已帶入進程的 DLL
- 關閉可視化樣式
- 搭配 HTML 內容使用可視化樣式
- 未套用視覺化樣式時
- 讓您的應用程式與舊版 Windows 相容
- 相關主題
使用指令清單或指示詞來確保視覺樣式可以套用至應用程式
若要讓應用程式使用可視化樣式,您必須使用第 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)
若要建立指令清單,並讓應用程式使用可視化樣式。
連結至 ComCtl32.lib,並呼叫 InitCommonControls。
將名為 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>
將指令清單新增至應用程式的資源檔,如下所示:
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
注意
當您將上一個專案新增至資源時,您必須將它格式化為一行。 或者,您可以將 XML 指令清單檔放在與應用程式可執行檔案相同的目錄中。 操作系統會先從文件系統載入指令清單,然後檢查可執行檔的資源區段。 檔案系統版本優先。
當您建置應用程式時,指令清單會新增為二進位資源。
在 控制台 中使用 ComCtl32 第 6 版或由 RunDll32.exe 執行的 DLL
若要建立指令清單,並讓應用程式使用可視化樣式。
連結至 ComCtl32.lib,並呼叫 InitCommonControls。
將名為 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>
將指令清單新增至應用程式的資源檔案作為資源標識碼 123。
注意
當您撰寫 控制台 應用程式時,請將它放在適當的類別中。 控制台 現在支援分類 控制台 應用程式。 這表示 控制台 應用程式可以指派標識符,並分成工作區域,例如新增或移除程式、外觀和主題,或日期、時間、語言和區域選項。
將可視化樣式支援新增至延伸模組、外掛程式、MMC 嵌入式管理單元或已帶入進程的 DLL
視覺效果樣式的支援可以新增至延伸模組、外掛程式、MMC 嵌入式管理單元,或帶入進程的 DLL。 例如,使用下列步驟來新增 Microsoft Management Console (MMC) 嵌入式管理單元的可視化樣式支援。
使用 -DISOLATION_AWARE_ENABLED 旗標編譯您的嵌入式管理單元,或在 #include “windows.h” 語句之前插入下列語句。
#define ISOLATION_AWARE_ENABLED 1
如需ISOLATION_AWARE_ENABLED的詳細資訊,請參閱 隔離元件。
在您的嵌入式管理單元來源中包含通用控制項頭檔。
#include <commctrl.h>
將名為 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>
將指令清單新增至嵌入式管理單元的資源檔。 如需將指令清單新增至資源檔的詳細資訊,請參閱 在使用擴充功能、外掛程式或已帶入程式的 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。
- 當視覺樣式無法如預期般運作時,請為實例撰寫錯誤處理程序代碼。
- 在舊版中安裝應用程式的指令清單不會影響控件的轉譯。
相關主題