www.pudn.com > CustomTabCtrlDemo.rar > ThemeUtil.cpp


/**********************************************************************
**
** ThemeUtil.cpp : implementation file of CThemeUtil class
**
** by Andrzej Markowski June 2004
**
**********************************************************************/

#include "stdafx.h"
#include "themeutil.h"

CThemeUtil::CThemeUtil()
{
m_hUxThemeDll = NULL;
m_hRcDll = NULL;
m_hTheme = NULL;
FreeLibrary();
if(IsWinXP())
m_hUxThemeDll = AfxLoadLibrary(CString(_T("UxTheme.dll")));
}

CThemeUtil::~CThemeUtil()
{
FreeLibrary();
}

void CThemeUtil::FreeLibrary()
{
CloseThemeData();
if(m_hUxThemeDll!=NULL)
AfxFreeLibrary(m_hUxThemeDll);
m_hUxThemeDll = NULL;
}

BOOL CThemeUtil::IsWinXP(void)
{
OSVERSIONINFO osvi;
::ZeroMemory(&amt;osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&amt;osvi);
return MAKELONG(osvi.dwMajorVersion,osvi.dwMinorVersion) >= MAKELONG(5,1);
}

BOOL CThemeUtil::OpenThemeData(HWND hWnd, LPCWSTR pszClassList)
{
if(m_hUxThemeDll==NULL || hWnd==NULL || m_hTheme)
return FALSE;
UINT (PASCAL* pfnIsThemeActive)(); // IsThemeActive
(FARPROC&amt;)pfnIsThemeActive=GetProcAddress(m_hUxThemeDll,"IsThemeActive");
if(pfnIsThemeActive &amt;&amt; pfnIsThemeActive())
{
UINT (PASCAL* pfnOpenThemeData)(HWND hwnd, LPCWSTR pszClassList);
(FARPROC&amt;)pfnOpenThemeData=GetProcAddress(m_hUxThemeDll,"OpenThemeData");
if(pfnOpenThemeData)
m_hTheme=pfnOpenThemeData(hWnd, pszClassList);
if(m_hTheme)
{
WCHAR szThemeFileName[MAX_PATH];
WCHAR szColorBuff[MAX_PATH];
WCHAR szSizeBuff[MAX_PATH];

if(GetCurrentThemeName(szThemeFileName,MAX_PATH,szColorBuff,MAX_PATH,szSizeBuff,MAX_PATH))
{
if((m_hRcDll = AfxLoadLibrary(CString(szThemeFileName))))
return TRUE;
}
CloseThemeData();
return FALSE;
}
}
return FALSE;
}

void CThemeUtil::CloseThemeData()
{
if(m_hTheme)
{
UINT (PASCAL* pfnCloseThemeData)(HANDLE hTheme);
(FARPROC&amt;)pfnCloseThemeData=GetProcAddress(m_hUxThemeDll,"CloseThemeData");
if(pfnCloseThemeData)
pfnCloseThemeData((HANDLE)m_hTheme);
}
m_hTheme = NULL;
if(m_hRcDll!=NULL)
AfxFreeLibrary(m_hRcDll);
m_hRcDll = NULL;
}

BOOL CThemeUtil::DrawThemePart(HDC hdc, int iPartId, int iStateId, const RECT *pRect)
{
if(m_hTheme==NULL)
return FALSE;
UINT (PASCAL* pfnDrawThemeBackground)(UINT hTheme, HDC hdc, int iPartId, int iStateId,
const RECT *pRect, const RECT* pClipRect);
(FARPROC&amt;)pfnDrawThemeBackground=GetProcAddress(m_hUxThemeDll,"DrawThemeBackground");
if(pfnDrawThemeBackground)
{
pfnDrawThemeBackground(m_hTheme, hdc, iPartId, iStateId, pRect, NULL);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetThemeColor(int iPartId, int iStateId, int iPropId, const COLORREF *pColor)
{
if(m_hTheme==NULL)
return FALSE;
UINT (PASCAL* pfnGetThemeColor)(UINT hTheme, int iPartId, int iStateId, int iPropId,
const COLORREF *pColor);
(FARPROC&amt;)pfnGetThemeColor=GetProcAddress(m_hUxThemeDll,"GetThemeColor");
if(pfnGetThemeColor)
{
pfnGetThemeColor(m_hTheme, iPartId, iStateId, iPropId, pColor);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetThemeEnumValue(int iPartId, int iStateId, int iPropId, const int *piVal)
{
if(m_hTheme==NULL)
return FALSE;

UINT (PASCAL* pfnGetThemeEnumValue)(UINT hTheme, int iPartId, int iStateId, int iPropId,
const int *piVal);
(FARPROC&amt;)pfnGetThemeEnumValue=GetProcAddress(m_hUxThemeDll,"GetThemeEnumValue");
if(pfnGetThemeEnumValue)
{
pfnGetThemeEnumValue(m_hTheme, iPartId, iStateId, iPropId, piVal);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetThemeInt(int iPartId, int iStateId, int iPropId, const int *piVal)
{
if(m_hTheme==NULL)
return FALSE;

UINT (PASCAL* pfnGetThemeInt)(UINT hTheme, int iPartId, int iStateId, int iPropId,
const int *piVal);
(FARPROC&amt;)pfnGetThemeInt=GetProcAddress(m_hUxThemeDll,"GetThemeInt");
if(pfnGetThemeInt)
{
pfnGetThemeInt(m_hTheme, iPartId, iStateId, iPropId, piVal);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetThemeMargins(int iPartId, int iStateId, int iPropId, const MY_MARGINS *pMargins)
{
if(m_hTheme==NULL)
return FALSE;

UINT (PASCAL* pfnGetThemeMargins)(UINT hTheme, OPTIONAL HDC hdc, int iPartId,
int iStateId, int iPropId, OPTIONAL RECT *prc, const MY_MARGINS *pMargins);
(FARPROC&amt;)pfnGetThemeMargins=GetProcAddress(m_hUxThemeDll,"GetThemeMargins");
if(pfnGetThemeMargins)
{
pfnGetThemeMargins(m_hTheme, NULL, iPartId, iStateId, iPropId, NULL, pMargins);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetThemeFilename(int iPartId, int iStateId, int iPropId,
OUT LPWSTR pszThemeFileName, int cchMaxBuffChars)
{
if(m_hTheme==NULL)
return FALSE;
UINT (PASCAL* pfnGetThemeFilename)(UINT hTheme, int iPartId, int iStateId, int iPropId,
OUT LPWSTR pszThemeFileName, int cchMaxBuffChars);
(FARPROC&amt;)pfnGetThemeFilename=GetProcAddress(m_hUxThemeDll,"GetThemeFilename");
if(pfnGetThemeFilename)
{
pfnGetThemeFilename(m_hTheme, iPartId, iStateId, iPropId, pszThemeFileName, cchMaxBuffChars);
return TRUE;
}
return FALSE;
}

BOOL CThemeUtil::GetCurrentThemeName(OUT LPWSTR pszThemeFileName, int cchMaxNameChars,
OUT OPTIONAL LPWSTR pszColorBuff, int cchMaxColorChars,
OUT OPTIONAL LPWSTR pszSizeBuff, int cchMaxSizeChars)
{
if(m_hUxThemeDll==NULL)
return FALSE;
UINT (PASCAL* pfnGetCurrentThemeName)(OUT LPWSTR pszThemeFileName,
int cchMaxNameChars,
OUT OPTIONAL LPWSTR pszColorBuff,
int cchMaxColorChars,
OUT OPTIONAL LPWSTR pszSizeBuff,
int cchMaxSizeChars);
(FARPROC&amt;)pfnGetCurrentThemeName=GetProcAddress(m_hUxThemeDll,"GetCurrentThemeName");
if(pfnGetCurrentThemeName)
{
pfnGetCurrentThemeName(pszThemeFileName,cchMaxNameChars,pszColorBuff,cchMaxColorChars,pszSizeBuff,cchMaxSizeChars);
return TRUE;
}
return FALSE;
}

HBITMAP CThemeUtil::LoadBitmap(LPWSTR pszBitmapName)
{
if(m_hRcDll==NULL)
return NULL;
try
{
CString sBitmapName(pszBitmapName);
sBitmapName.Replace('\\','_');
sBitmapName.Replace('.','_');
return ::LoadBitmap(m_hRcDll,sBitmapName);
}
catch(CMemoryException* e)
{
e->Delete();
}
return NULL;
}