为OWNERDRAW控件添加XP视觉样式支持






4.95/5 (37投票s)
2001年12月23日
2分钟阅读

393166

9432
使用WinXP中可用的视觉样式API的包装类。
引言
这是一个包装类,用于使用 Windows XP 中提供的视觉样式 API。视觉样式可以改变所有“支持”应用程序的外观和感觉。在应用程序中添加视觉样式支持非常容易。请查阅 MSDN 以获取更多信息。
但是,如果您计划使用任何 OWNERDRAW
控件,则不会自动获得新的外观。Windows 并不足够智能,无法知道您的控件应该是什么样子。您必须直接调用新的 UxTheme
API。
使用该 API 非常简单,在大多数情况下,您只需要其中的几个。下面的示例以 TOOLBAR
样式绘制一个已选按钮。
HTHEME hTheme = OpenThemeData(GetSafeHwnd(), L"TOOLBAR");
DrawThemeBackground(hTheme, pDC->GetSafeHdc(),TP_BUTTON, TS_CHECKED, &rc, 0);
CloseThemeData(hTheme);
当您在早期版本的 Windows 下运行应用程序时,会出现问题,因为直接调用这些 API 会使您的应用程序依赖于新的 DLL,而这些 DLL 无法重新分发。本文提供的类试图通过包装 API 并进行运行时链接来解决此问题。这只是大量的复制粘贴工作,一点也不有趣。:)
微软实际上在 MFC 7.0 (winctrl3.cpp) 中做了一个薄包装器,但它只包装了几个 API,并且它们主要用于 MFC 的内部使用。该类基于 MFC 实现,并包装了来自 Microsoft Platform SDK August 2001 的完整视觉样式 API 集。为了在 VC++ 6.0 中编译此类,您需要拥有最新的 Platform SDK,或者至少包含新的 XP 头文件。在 VC++ 7.0 下,不需要额外的头文件。
如何使用
使用此类的操作非常简单。您首先需要在 stdafx.h 中包含头文件,并将 CPP 文件添加到项目中。
#include "VisualStylesXP.h"
然后,您可以创建一个本地 CVisualStylesXP
成员并调用函数,或者使用内置的全局变量 g_xpStyle
。
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
Copyright
演示应用程序是从 MSDN 的 ThemeExplorer
应用程序移植而来。
就这样了。祝您编码愉快!
历史
- 2001年12月23日:初始版本
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。