在Windows XP操作系统中,视觉样式API允许开发者改变应用程序的外观和感觉。这些API使得应用程序能够支持Windows XP的视觉样式,从而提供更加现代化和一致的用户体验。
对于大多数应用程序来说,添加视觉样式的支持非常简单。只需要调用几个API函数即可。例如,下面的C++代码展示了如何在工具栏样式中绘制一个选中的按钮:
HTHEME hTheme = OpenThemeData(GetSafeHwnd(), L"TOOLBAR");
DrawThemeBackground(hTheme, pDC->GetSafeHdc(), TP_BUTTON, TS_CHECKED, &rc, 0);
CloseThemeData(hTheme);
这段代码首先打开一个主题数据句柄,然后使用该句柄在指定的设备上下文中绘制一个按钮,最后关闭主题数据句柄。
如果计划使用任何自定义绘制(OWNERDRAW)控件,不会得到新的视觉样式外观。Windows并不知道控件应该如何看起来。必须直接调用新的UxThemeAPI。
当应用程序在早期版本的Windows上运行时,可能会遇到问题,因为直接调用这些API会使应用程序依赖于新的DLL,而这些DLL是不可重新分发的。本文提供的类通过封装API并进行运行时链接来解决这个问题。
Microsoft在MFC 7.0中提供了一个薄薄的封装(winctrl3.cpp),但它只封装了少数API,主要用于MFC的内部使用。本文的类基于MFC的实现,并封装了Microsoft Platform SDK 2001年8月的全部视觉样式API。
使用这个类非常简单。首先,需要包含头文件,最好在stdafx.h中,并添加CPP文件到项目中。然后,可以创建一个CVisualStylesXP成员并调用函数,或者使用内置的全局变量g_xpStyle。
#include "VisualStylesXP.h"
HTHEME hTheme = g_xpStyle.OpenThemeData(GetSafeHwnd(), L"TOOLBAR");
g_xpStyle.DrawThemeBackground(hTheme, pDC->GetSafeHdc(), TP_BUTTON, TS_CHECKED, &rc, 0);
g_xpStyle.CloseThemeData(hTheme);
为了使应用程序在所有Windows版本下都能工作,应该这样做:
#ifdef _VISUALSTYLE_XP_H_
if (g_xpStyle.IsAppThemed())
{
HTHEME hTheme = g_xpStyle.OpenThemeData(GetSafeHwnd(), L"TOOLBAR");
g_xpStyle.DrawThemeBackground(hTheme, pDC->GetSafeHdc(), TP_BUTTON, TS_CHECKED, &rc, 0);
g_xpStyle.CloseThemeData(hTheme);
}
else
{
#endif
pDC->DrawEdge(...);
#ifdef _VISUALSTYLE_XP_H_
}
#endif