![]() |
Platforms, Frameworks & Libraries »
Win32/64 SDK & OS »
General
Intermediate
License: The Code Project Open License (CPOL)
Add XP Visual Style Support to OWNERDRAW ControlsBy David Y. ZhaoA wrapper class to use the visual style APIs available in Windows XP |
VC6, VC7WinXP, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||

This is a wrapper class to use the visual style APIs available in Windows XP. Visual style makes it possible to change the look and feel of all the "supported" applications. It is very easy to add support for visual styles in an application. Check on MSDN for more information.
However, if you plan to use any OWNERDRAW controls, you won't get the new look automatically. Windows is just not smart enough to know how your control should look. You have to make calls directly to the new UxTheme APIs.
It is quite simple to use the API, and in most cases you just need a few of them. The sample below draws a checked button in TOOLBAR style.
HTHEME hTheme = OpenThemeData(GetSafeHwnd(), L"TOOLBAR"); DrawThemeBackground(hTheme, pDC->GetSafeHdc(),TP_BUTTON, TS_CHECKED, &rc, 0); CloseThemeData(hTheme);
Problems arise when you running the application under an earlier version of Windows, since calling these APIs directly makes your application dependent on the new DLLs which are not redistributable. The class provided in this article tries to solve this problem by wrapping the APIs and doing run-time linking. It is just a lot of copy-n-paste work, no fun at all. :)
Microsoft has actually done a thin wrapper in MFC 7.0 (winctrl3.cpp), but it only wraps a few of the APIs and they are mostly for MFC's internal usage. This class is based on the MFC implemenation and wraps the full set of visual style APIs from the Micrsoft Platform SDK August 2001. In order to compile this class in VC++ 6.0, you will need to have the latest Platform SDK, or at least one with the new XP headers. Under VC++ 7.0, no additional headers are required.
It is very simple to use this class. You need first to include the header, preferably in stdafx.h and add the CPP file to the project.
#include "VisualStylesXP.h"
You can then either create a local CVisualStylesXP member and call the functions, or use the built-in global variable 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);
To make your application work under all windows versions, you should do something like this:
#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
The demonstration application is a port from the ThemeExplorer application from MSDN.
That's all. Happy coding!
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 22 Dec 2001 Editor: Chris Maunder |
Copyright 2001 by David Y. Zhao Everything else Copyright © CodeProject, 1999-2009 Web15 | Advertise on the Code Project |