Windows 用戶體驗組
Microsoft Corporation
2001年5月
本文只是初步的文檔,如有更改,恕不另行通知。
概要:本文檔說明了如何使用 Microsoft Windows XP 來完成將外觀風格應用于應用程序時必需執行的常見任務。
目錄
- 簡介
- ComCtl32.dll 版本 6
- 外觀風格任務
- 在未使用第三方擴展的應用程序中使用 ComCtl32.dll 版本 6
- 在使用擴展、插件或進程內運行的 DLL 的應用程序中使用 ComCtl32 版本 6
- 在控制面板中或在通過 RunDll32.exe 運行的 DLL 中使用 ComCtl32 版本 6
- 將外觀風格用于自定義控件
- 使自行繪制的控件能夠使用外觀風格
- 使控件在具有外觀風格的對話框或窗口中不顯示外觀風格
- 使用 UxTheme 管理程序呈現其部件不具有外觀風格的控件
- 將外觀風格用于 HTML 內容
- 使 UxTheme 管理程序忽略頂層窗口
- 使用 32 位抗失真圖標
- 使您的應用程序可同時在 Windows XP 和 Windows 的早期版本上正常運行
- 總結
簡介
通過使用 Microsoft® Windows® XP,您現在可以定義控件和窗口的外觀風格,例如簡單的顏色以及紋理和形狀。您可以控制控件中的每個定義部件,也可以控制窗口中非客戶端(框架和標題)區域的每個部件。之后,用戶可以使用 Windows 控制面板中的“外觀”選項卡在傳統外觀風格和其它可用風格之間進行切換。
Windows XP 版本提供外觀風格。通過使用助手庫和應用編程接口 (API),您無需更改過多代碼即可在您的應用程序中使用 Windows XP 的外觀風格。有關詳細信息,請參閱 MSDN Library 中的 Platform SDK 文檔。
ComCtl32.dll 版本 6
Windows XP 操作系統上運行的所有應用程序都有一個非客戶端區域,其中包括窗口框架和非客戶端滾動條。默認情況下,外觀風格將應用于非客戶端區域。這意味著非客戶端區域的外觀由當前安裝的外觀風格指定。要將外觀風格應用于客戶端區域中的常用控件,必須使用 ComCtl32.dll 版本 6 或更高版本。與 ComCtl32.dll 的早期版本不同,ComCtl32.dll 版本 6 不可重新分發。要使用動態鏈接庫 (DLL) 的版本 6,唯一途徑是使用包含它的操作系統。Windows XP 同時提供版本 5 和版本 6。ComCtl32.dll 版本 6 中包含用戶控件和常用控件。默認情況下,各種應用程序使用 User32.dll 中定義的用戶控件和 ComCtl32.dll 版本 5 中定義的常用控件。
如果要讓您的應用程序使用外觀風格,必須添加應用程序聲明,指出如果 ComCtl32.dll 版本 6 可用,則應該使用它。版本 6 包括一些新控件和其它控件的新選項,但是,最大的變化是支持對控件在窗口中的外觀進行更改。
外觀風格任務
要將外觀風格添加到您的控件,可能需要執行以下一些任務。
在未使用第三方擴展的應用程序中使用 ComCtl32.dll 版本 6
下面是一些未使用第三方擴展的應用程序示例。
- 計算器
- FreeCell
- 掃雷
- 記事本
- 紙牌
要創建聲明并使您的應用程序能夠使用外觀風格,請執行以下步驟:
- 鏈接到 ComCtl32.lib 并調用 InitCommonControls(請參閱 MSDN Library 中的 Platform SDK 文檔)。
- 將名為 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="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>此處是您的應用程序說明。</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
- 將聲明添加到應用程序的資源文件中,如下所示:
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
注意:如果將前一項添加到資源中,則必須在一行中對其進行格式設置;蛘,您可以將 XML 聲明文件放置在與應用程序的可執行文件相同的目錄中。操作系統將首先從文件系統加載聲明,然后檢查可執行文件的資源部分。文件系統版本優先。
在使用擴展、插件或進程內運行的 DLL 的應用程序中使用 ComCtl32 版本 6
下面是一些使用擴展的應用程序的示例。
- Microsoft Management Console (Mmc.exe)
- Windows Shell
- Microsoft® Visual Studio®
要創建聲明并使您的應用程序能夠使用外觀風格,請執行以下步驟:
- 使用 Windows XP Beta 2 SDK 或更高版本。
- 包括常用控件標題文件,如下所示:
#include "commctrl.h"
- 定義編譯器變量預處理程序定義,如下所示:
#define SIDEBYSIDE_COMMONCONTROLS 1
將名為 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="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>此處是您的應用程序說明。</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
- 將聲明添加到應用程序的資源文件中,如下所示:
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.manifest"
Winuser.rh 包括以下定義:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define CONTROL_PANEL_RESOURCE_ID 123
#define RT_MANIFEST 24
在控制面板中或在通過 RunDll32.exe 運行的 DLL 中使用 ComCtl32 版本 6
要創建聲明并使您的應用程序能夠使用外觀風格,請執行以下步驟:
- 鏈接到 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="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>此處是您的應用程序說明。</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
- 將聲明添加到應用程序的資源文件中,如下所示:
CONTROL_PANEL_RESOURCE_ID RT_MANIFEST "YourCpl.manifest"
注意:編寫完控制面板應用程序后,請將其放置在相應的類別中,F在,控制面板支持控制面板應用程序的分類。也就是說,可以為控制面板應用程序分配標識符并將其分為若干個任務區域,如“添加或刪除程序”、“外觀和主題”、“日期、時間、語言和區域選項”。
將外觀風格用于自定義控件
標題文件 Uxtheme.h 中定義了在向控件添加外觀風格的步驟中以及在相應的代碼示例中所引用的 UxTheme API。Platform SDK 中對該 API 的各元素進行了說明。本節將說明將外觀風格應用于控件的步驟,并提供一個繪圖代碼示例以及有關繪制控件的技巧。
要使控件能夠應用外觀風格,請執行以下步驟:
- 調用 OpenThemeData 并將要應用外觀風格的控件的 hwnd 傳遞給說明控件類型的類列表。Tmschema.h 中定義了各個類。OpenThemeData 返回一個 HTHEME 句柄,但是,如果外觀風格管理器被禁用或當前的外觀風格沒有為給定控件提供特定的信息,該函數將返回 NULL。如果返回值是 NULL,則使用非外觀風格的繪圖函數。
- 要繪制控件,請調用 DrawThemeBackground 并傳遞以下內容:
- OpenThemeData 所返回的主題句柄 HDC,它用于呈現控件。
- 部件標識符,用于說明要呈現的控件部件。有關控件的部件和狀態的信息,請參見“主題部件和狀態”。
- 狀態標識符,用于說明部件的當前狀態。
- 指向 RECT 結構的指針,該結構包含將呈現控件的矩形的坐標。
- OpenThemeData 所返回的主題句柄 HDC,它用于呈現控件。
- 有些部件可以是半透明的。要確定部件的透明度,可以使用主題句柄、控件部件和控件狀態調用 IsThemeBackgroundPartiallyTransparent。
- 如果控件繪制的是文本,請將文本放置于控件的內容矩形中并選擇字體。
- 要確定內容矩形的位置,請調用 GetThemeBackgroundContentRect。
- 將所需字體添加到設備上下文 (DC) 中,然后調用 DrawThemeText。該函數將啟用外觀效果,如一些控件中的陰影文本。
- 要確定內容矩形的位置,請調用 GetThemeBackgroundContentRect。
- 控件在接收到 WM_THEMECHANGED 消息后,應執行以下操作:
- 調用 CloseThemeData 以關閉現有主題句柄。
- 調用 OpenThemeData 以獲得剛加載的外觀風格的主題句柄。
- 此代碼示例說明了這兩種調用。
case WM_THEMECHANGED: CloseThemeData (hTheme); hTheme = OpenThemeData (hwnd, L"MyClassName");
- 調用 CloseThemeData 以關閉現有主題句柄。
- 控件在接收到 WM_DESTROY 消息后,將調用 CloseThemeData 以釋放在調用 OpenThemeData 時返回的主題句柄。
繪圖代碼示例
下面的代碼示例說明了如何繪制按鈕控件。
HTHEME hTheme = NULL;
hTheme = OpenThemeData(hwndButton, "Button");
...
DrawMyControl(hDC, hwndButton, hTheme, iState);
...
if (hTheme)
{
CloseTheme(hTheme);
}
void DrawMyControl(HDC hDC, HWND hwndButton, HTHEME hTheme, int iState)
{
RECT rc, rcContent;
TCHAR szButtonText[255];
HRESULT hr;
GetWindowRect(hwndButton, &rc);
GetWindowText(hwndButton, szButtonText,
ARRAYSIZE(szButtonText));
if (hTheme)
{
hr = DrawThemeBackground(hTheme, hDC, BP_BUTTON,
iState, &rc, 0);
//務必檢查生成的代碼。
hr = GetThemeBackgroundContentRect(hTheme,
BP_BUTTON, iState, &rc, &rcContent);
hr = DrawThemeText(hTheme, hDC, BP_BUTTON, iState,
szButtonText, lstrlen(szButtonText),
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
0, &rcContent);
}
else
{
// 繪制控件時不使用外觀風格。
}
}
使自行繪制的控件能夠使用外觀風格
在 Windows XP 中,控件不再僅僅由線條和填充色組成,F在,它們包括可以隨控件狀態而變化的豐富紋理和圖案。這意味著您不能使用現有的編程元素來說明那些與已應用外觀風格的控件具有相同外觀的自行繪制控件。如果您的代碼中已包含自行繪制控件,則可以進行以下選擇。
- 您可以調用 SetWindowTheme 來關閉控件的主題。
SetWindowTheme (hwndButton, TEXT (" "), TEXT (" "));
控件的呈現方式與在 Windows 早期版本中相同。
- 您可以在控件中繼續使用自行繪制方法,但有些屬性將被忽略。例如,如果更改按鈕的背景顏色,那么按鈕將被繪制成已應用外觀風格的按鈕,但背景顏色并不是指定的顏色。但是,如果更改字體,則將使用指定的字體繪制該按鈕。
使控件在具有外觀風格的對話框或窗口中不顯示外觀風格
在某些情況下,應用程序具有不應該使用外觀風格的自定義繪制控件(即使窗口中的其它控件已應用外觀風格)。如果要將任何自定義繪制的控件標記為無外觀風格,必須調用 SetWindowTheme,還必須傳入該控件的窗口句柄,并為 pszSubAppName 和 pszSubIdList 參數傳入空字符串。通過調用帶有空字符串的 SetWindowTheme 函數,可以使控件不呈現外觀風格。以下代碼片斷顯示了如何創建按鈕控件,然后調用 SetWindowTheme 函數來刪除按鈕的外觀風格。
HWND hwndButton;
hwndButton = CreateWindow (TEXT ("按鈕"), ...);
if (hwndButton)
{
SetWindowTheme (hwndButton, TEXT (" "), TEXT (" "));
}
注意:如果您決定在運行時將控件更改為外觀風格控件,可以調用 SetWindowTheme,但將 NULL 傳遞給兩個字符串參數。
使用 UxTheme 管理程序呈現其部件不具有外觀風格的控件
如果您的控件不屬于常用控件,但希望該控件在安裝有外觀風格文件的計算機上具有適當的外觀,則可以采用以下方法之一。
- 基本方法是使用系統標準顏色。大多數系統標準顏色都在應用外觀風格文件時設置。
- 您可以使用其它控件的部件,并分別呈現每個部件。例如,對于由網格組成的日歷控件,您可以將網格所形成的每個正方形當作工具欄按鈕。執行以下步驟將正方形編程為工具欄按鈕。
調用 OpenThemeData,如下所示:
OpenThemeData (hwnd, "Toolbar");
使用返回的主題句柄來呈現日歷上的每個正方形。
- 要組合和匹配控件部件,可以對給定控件多次調用 OpenThemeData 并使用相應的主題句柄來繪制不同的部件。但是,在某些外觀風格中,有些部件可能與其它部件不兼容。
- 有些專用的應用程序需要在控件級以上與 Windows XP 外觀匹配,它們就可能需要檢測當前加載的外觀風格,并設計與外觀匹配的自定義呈現。對于提供外觀風格體系結構的應用程序而言,這是很有用的。
將外觀風格用于 HTML 內容
很多應用程序是用 HTML 編寫并作為 HTML 應用程序 (HTA) 或 Win32 應用程序來部署的。這些應用程序使用的是 HTML 或在它們的 UI 元素中托管 WebObject。當在 Windows XP 上運行時,這些應用程序將與運行在同一操作系統上基于 Win32 的應用程序具有一致的外觀。將外觀風格應用于 HTML 內容時,需要考慮以下事項:
- 與 HTML 內容相關的外觀風格僅應用于固有的 HTML 控件,如按鈕、滾動條和選擇控件。Windows XP 的外觀風格將自動應用于 HTML 頁面上的控件。如果不想將外觀風格應用于頁面,請使用屬性設置為 NO 的 META 標記。在下面的一節中說明了此 META 標記。
- 不會對修改了層疊樣式表 (CSS)(如背景或邊框)的 HTML 頁面應用外觀風格。它們將顯示指定的 CSS 屬性。
- 大多數 CSS 屬性在被指定為內容的一部分時,都可以應用于已應用外觀風格的元素。
- 您必須在頁面的 <head> 部分中添加元標記。您只需將該標記添加一次,外觀風格就能將其應用于所有頁面內容。它也將應用于打包為 HTA 的內容。元標記必須如下:
<META HTTP-EQUIV="MSThemeCompatible" CONTENT="Yes">
- 注意,外觀風格可能會更改內容的布局。此外,在設置固有 HTML 控件的某些屬性(如按鈕的寬度)時,您可能會發現在某些外觀風格下,按鈕上的標簽無法讀取。
- 您必須使用外觀風格徹底測試您的內容,以確定外觀風格的應用是否會對內容和布局產生負面影響。進行所需的更改,使您的內容成功呈現。
使 UxTheme 管理程序忽略頂層窗口
為了避免將新的外觀風格應用于頂層窗口,請考慮以下因素:
- 如果窗口已應用一個區域,UxTheme Manager 就將假定該區域是一個專用窗口,并且該窗口在其整個生存期中將不使用外觀風格。即使父窗口并沒有使用外觀風格,與非外觀風格的頂層窗口相關聯的子窗口仍可能應用外觀風格。
- 如果您將某個區域應用于頂層窗口,隨后又將其刪除,那么外觀風格將不會自動應用于該窗口。要將外觀風格應用于該窗口,您必須創建一個新窗口。
- 如果要禁止應用程序中所有頂層窗口使用外觀風格,請調用 SetThemeAppProperties,但不傳遞 STAP_ALLOW_NONCLIENT 標志。
- 如果應用程序未調用 SetThemeAppProperties,則假定的標志值為 STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS | STAP_ALLOW_WEBCONTENT。假定值將使非客戶端區域、控件以及 Web 內容應用外觀風格。
使用 32 位抗失真圖標
Windows XP 圖像列表是用于某些控件(如列表視圖控件)的圖像集,它支持使用 32 位抗失真圖標和位圖。顏色值使用 24 位,而 8 位用作圖標上的 alpha 通道。要創建可以處理 32 位/像素 (bpp) 圖像的圖像列表,請調用 ImageList_Create 函數,并傳遞 ILC_COLOR32 標志。
下圖說明了圖標格式尚未更改,但創建這些圖標的方式已經改變。
圖標格式
要正確創建 32 位圖標,請執行以下步驟:
- 為每個圖標創建多個圖像。下圖顯示了這些圖像。
同一圖標的多個圖像
- 在上圖中,前三個圖像為 16 色模式,用于安全模式。
- 接下來的三個圖標用于 Windows XP 256 色模式。
- 最后三個圖標具有 Alpha 通道,僅能用于以 24 位或更高位顏色運行的 Windows XP 或更高版本的操作系統。
- 在圖標格式中,這些圖像的排列順序比較重要。如果順序不正確,低版本 Windows 在抽取這些圖標時可能會出錯。錯誤地抽取圖標會導致內存崩潰和呈現不正常。
- Windows 早期版本具有 10 個圖標的資源限制,而 Windows XP 卻支持上千個圖標資源。
注意:您可以使用第三方工具生成包含 Alpha 通道的圖標文件和位圖。
使您的應用程序可同時在 Windows XP 和 Windows 的早期版本上正常運行
Windows XP 外觀風格體系結構中的大部分都是為了使您的產品仍能在不支持更改控件外觀的舊版 Windows 上正常運行。為了使應用程序能在多個操作系統上正常運行,請注意以下事項:
- 在舊版本操作系統中安裝應用程序的聲明將不會影響控件的顯示。
- 您必須測試您的應用程序,以確保先檢查當前版本而不依賴于 ComCtl32.dll 版本 6 的功能。
- 不要直接鏈接到 UxTheme.lib。如果您使用 UxTheme API 來向自定義控件添加外觀風格,請根據需要加載庫。
- 如果外觀風格無法達到預期效果,則為實例編寫錯誤處理代碼。
- 如果您使用的是 ComCtl32.dll 版本 6 中的功能(如平鋪視圖或鏈接控件),則必須處理無法在用戶計算機上使用這些控件的情況。ComCtl32.dll 版本 6 不可重新分發。
總結
本文檔說明了將外觀風格應用于應用程序時必須執行的任務。它沒有包括需要執行的所有任務,而是討論了一些最常見任務。
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月