65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (37投票s)

2001年12月23日

2分钟阅读

viewsIcon

393166

downloadIcon

9432

使用WinXP中可用的视觉样式API的包装类。

Sample Image - xpvisualstyle.gif

引言

这是一个包装类,用于使用 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日:初始版本

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.