将外观风格用于自定义控件标题文件 Uxtheme.h 中定义了在向控件添加外观风格的步骤中以及在相应的代码示例中所引用的 UxTheme API。Platform SDK 中对该 API 的各元素进行了说明。本节将说明将外观风格应用于控件的步骤,并提供一个绘图代码示例以及有关绘制控件的技巧。
要使控件能够应用外观风格,请执行以下步骤:
- 调用 OpenThemeData 并将要应用外观风格的控件的 hwnd 传递给说明控件类型的类列表。Tmschema.h 中定义了各个类。OpenThemeData 返回一个 HTHEME 句柄,但是,如果外观风格管理器被禁用或当前的外观风格没有为给定控件提供特定的信息,该函数将返回 NULL。如果返回值是 NULL,则使用非外观风格的绘图函数。
- 要绘制控件,请调用 DrawThemeBackground 并传递以下内容:
- OpenThemeData 所返回的主题句柄 HDC,它用于呈现控件。
- 部件标识符,用于说明要呈现的控件部件。有关控件的部件和状态的信息,请参见“主题部件和状态”。
- 状态标识符,用于说明部件的当前状态。
- 指向 RECT 结构的指针,该结构包含将呈现控件的矩形的坐标。
- 有些部件可以是半透明的。要确定部件的透明度,可以使用主题句柄、控件部件和控件状态调用 IsThemeBackgroundPartiallyTransparent。
- 如果控件绘制的是文本,请将文本放置于控件的内容矩形中并选择字体。
- 要确定内容矩形的位置,请调用 GetThemeBackgroundContentRect。
- 将所需字体添加到设备上下文 (DC) 中,然后调用 DrawThemeText。该函数将启用外观效果,如一些控件中的阴影文本。
- 控件在接收到 WM_THEMECHANGED 消息后,应执行以下操作:
- 控件在接收到 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
{
// 绘制控件时不使用外观风格。
}
}