case wm_themechanged:
closethemedata (htheme);
htheme = openthemedata (hwnd, l"myclassname");
绘图代码示例
下面的代码示例说明了如何绘制按钮控件。
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 中,控件不再仅仅由线条和填充色组成。现在,它们包括可以随控件状态而变化的丰富纹理和图案。这意味着您不能使用现有的编程元素来说明那些与已应用外观风格的控件具有相同外观的自行绘制控件。如果您的代码中已包含自行绘制控件,则可以进行以下选择。
- 您可以调用 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 标志。