📄 visualstylesxp.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2001-2002 by David Yuheng Zhao
//
// Distribute and change freely, except: don't remove my name from the source
//
// No warrantee of any kind, express or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
//
// Partly based on the _ThemeHelper struct in MFC7.0 source code (winctrl3.cpp),
// and the difference is that this implementation wraps the full set of
// visual style APIs from the platform SDK August 2001
//
// If you have any questions, I can be reached as follows:
// yuheng_zhao@yahoo.com
//
//
// How to use:
// Instead of calling the API directly,
// OpenThemeData(...);
// use the global variable
// g_xpStyle.OpenThemeData(...);
//
//
//
// Date: 2002-07-27
// This update was made by Mathias Tunared.
// He changed the function variable to static to make the code faster.
// He also added the function 'UseVisualStyles()' so you can check if to
// draw with the visual styles or not. That function checks first the
// version of the 'ComCtl32.dll' and the checks if the theme is activated
// and the HTHEME handle is not NULL.
//
// CAdvComboBox Control
// Version: 2.1
// Date: August 2002
// Author: Mathias Tunared
// Email: Mathias@inorbit.com
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability for any damage/loss of business that
// this product may cause.
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "visualstylesxp.h"
#include <Shlwapi.h>
CVisualStylesXP g_xpStyle;
CVisualStylesXP::CVisualStylesXP(void)
{
m_hThemeDll = LoadLibrary(_T("UxTheme.dll"));
}
CVisualStylesXP::~CVisualStylesXP(void)
{
if (m_hThemeDll!=NULL)
FreeLibrary(m_hThemeDll);
m_hThemeDll = NULL;
}
void* CVisualStylesXP::GetProc(LPCSTR szProc, void* pfnFail)
{
void* pRet = pfnFail;
if (m_hThemeDll != NULL)
pRet = GetProcAddress(m_hThemeDll, szProc);
return pRet;
}
HTHEME CVisualStylesXP::OpenThemeData(HWND hwnd, LPCTSTR pszClassList)
{
static PFNOPENTHEMEDATA pfnOpenThemeData = NULL;
if( !pfnOpenThemeData )
pfnOpenThemeData = (PFNOPENTHEMEDATA)GetProc("OpenThemeData", (void*)OpenThemeDataFail);
return (*pfnOpenThemeData)(hwnd, pszClassList);
}
HRESULT CVisualStylesXP::CloseThemeData(HTHEME hTheme)
{
static PFNCLOSETHEMEDATA pfnCloseThemeData = NULL;
if( !pfnCloseThemeData )
pfnCloseThemeData = (PFNCLOSETHEMEDATA)GetProc("CloseThemeData", (void*)CloseThemeDataFail);
return (*pfnCloseThemeData)(hTheme);
}
HRESULT CVisualStylesXP::DrawThemeBackground(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
{
static PFNDRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL;
if( !pfnDrawThemeBackground )
pfnDrawThemeBackground = (PFNDRAWTHEMEBACKGROUND)GetProc("DrawThemeBackground", (void*)DrawThemeBackgroundFail);
return (*pfnDrawThemeBackground)(hTheme, hdc, iPartId, iStateId, pRect, pClipRect);
}
HRESULT CVisualStylesXP::DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId,
int iStateId, LPCTSTR pszText, int iCharCount, DWORD dwTextFlags,
DWORD dwTextFlags2, const RECT *pRect)
{
static PFNDRAWTHEMETEXT pfn = NULL;
if( !pfn )
pfn = (PFNDRAWTHEMETEXT)GetProc("DrawThemeText", (void*)DrawThemeTextFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect);
}
HRESULT CVisualStylesXP::GetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, const RECT *pBoundingRect,
RECT *pContentRect)
{
static PFNGETTHEMEBACKGROUNDCONTENTRECT pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEBACKGROUNDCONTENTRECT)GetProc("GetThemeBackgroundContentRect", (void*)GetThemeBackgroundContentRectFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pBoundingRect, pContentRect);
}
HRESULT CVisualStylesXP::GetThemeBackgroundExtent(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, const RECT *pContentRect,
RECT *pExtentRect)
{
static PFNGETTHEMEBACKGROUNDEXTENT pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEBACKGROUNDEXTENT)GetProc("GetThemeBackgroundExtent", (void*)GetThemeBackgroundExtentFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pContentRect, pExtentRect);
}
HRESULT CVisualStylesXP::GetThemePartSize(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, RECT * pRect, enum THEMESIZE eSize, SIZE *psz)
{
static PFNGETTHEMEPARTSIZE pfnGetThemePartSize = NULL;
if( !pfnGetThemePartSize )
pfnGetThemePartSize = (PFNGETTHEMEPARTSIZE)GetProc("GetThemePartSize", (void*)GetThemePartSizeFail);
return (*pfnGetThemePartSize)(hTheme, hdc, iPartId, iStateId, pRect, eSize, psz);
}
HRESULT CVisualStylesXP::GetThemeTextExtent(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, LPCTSTR pszText, int iCharCount,
DWORD dwTextFlags, const RECT *pBoundingRect,
RECT *pExtentRect)
{
static PFNGETTHEMETEXTEXTENT pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMETEXTEXTENT)GetProc("GetThemeTextExtent", (void*)GetThemeTextExtentFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, pBoundingRect, pExtentRect);
}
HRESULT CVisualStylesXP::GetThemeTextMetrics(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, TEXTMETRIC* ptm)
{
static PFNGETTHEMETEXTMETRICS pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMETEXTMETRICS)GetProc("GetThemeTextMetrics", (void*)GetThemeTextMetricsFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, ptm);
}
HRESULT CVisualStylesXP::GetThemeBackgroundRegion(HTHEME hTheme, HDC hdc,
int iPartId, int iStateId, const RECT *pRect, HRGN *pRegion)
{
static PFNGETTHEMEBACKGROUNDREGION pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEBACKGROUNDREGION)GetProc("GetThemeBackgroundRegion", (void*)GetThemeBackgroundRegionFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pRect, pRegion);
}
HRESULT CVisualStylesXP::HitTestThemeBackground(HTHEME hTheme, HDC hdc, int iPartId,
int iStateId, DWORD dwOptions, const RECT *pRect, HRGN hrgn,
POINT ptTest, WORD *pwHitTestCode)
{
static PFNHITTESTTHEMEBACKGROUND pfn = NULL;
if( !pfn )
pfn = (PFNHITTESTTHEMEBACKGROUND)GetProc("HitTestThemeBackground", (void*)HitTestThemeBackgroundFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, dwOptions, pRect, hrgn, ptTest, pwHitTestCode);
}
HRESULT CVisualStylesXP::DrawThemeEdge(HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
const RECT *pDestRect, UINT uEdge, UINT uFlags, RECT *pContentRect)
{
static PFNDRAWTHEMEEDGE pfn = NULL;
if( !pfn )
pfn = (PFNDRAWTHEMEEDGE)GetProc("DrawThemeEdge", (void*)DrawThemeEdgeFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pDestRect, uEdge, uFlags, pContentRect);
}
HRESULT CVisualStylesXP::DrawThemeIcon(HTHEME hTheme, HDC hdc, int iPartId,
int iStateId, const RECT *pRect, HIMAGELIST himl, int iImageIndex)
{
static PFNDRAWTHEMEICON pfn = NULL;
if( !pfn )
pfn = (PFNDRAWTHEMEICON)GetProc("DrawThemeIcon", (void*)DrawThemeIconFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, pRect, himl, iImageIndex);
}
BOOL CVisualStylesXP::IsThemePartDefined(HTHEME hTheme, int iPartId,
int iStateId)
{
static PFNISTHEMEPARTDEFINED pfn = NULL;
if( !pfn )
pfn = (PFNISTHEMEPARTDEFINED)GetProc("IsThemePartDefined", (void*)IsThemePartDefinedFail);
return (*pfn)(hTheme, iPartId, iStateId);
}
BOOL CVisualStylesXP::IsThemeBackgroundPartiallyTransparent(HTHEME hTheme,
int iPartId, int iStateId)
{
static PFNISTHEMEBACKGROUNDPARTIALLYTRANSPARENT pfn = NULL;
if( !pfn )
pfn = (PFNISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)GetProc("IsThemeBackgroundPartiallyTransparent", (void*)IsThemeBackgroundPartiallyTransparentFail);
return (*pfn)(hTheme, iPartId, iStateId);
}
HRESULT CVisualStylesXP::GetThemeColor(HTHEME hTheme, int iPartId,
int iStateId, int iPropId, COLORREF *pColor)
{
static PFNGETTHEMECOLOR pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMECOLOR)GetProc("GetThemeColor", (void*)GetThemeColorFail);
return (*pfn)(hTheme, iPartId, iStateId, iPropId, pColor);
}
HRESULT CVisualStylesXP::GetThemeMetric(HTHEME hTheme, HDC hdc, int iPartId,
int iStateId, int iPropId, int *piVal)
{
static PFNGETTHEMEMETRIC pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEMETRIC)GetProc("GetThemeMetric", (void*)GetThemeMetricFail);
return (*pfn)(hTheme, hdc, iPartId, iStateId, iPropId, piVal);
}
HRESULT CVisualStylesXP::GetThemeString(HTHEME hTheme,
int iPartId,
int iStateId,
int iPropId,
LPCTSTR pszBuff,
int cchMaxBuffChars)
{
static PFNGETTHEMESTRING pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMESTRING)GetProc("GetThemeString", (void*)GetThemeStringFail);
return (*pfn)(hTheme, iPartId, iStateId, iPropId, pszBuff, cchMaxBuffChars);
}
HRESULT CVisualStylesXP::GetThemeBool(HTHEME hTheme, int iPartId,
int iStateId, int iPropId, BOOL *pfVal)
{
static PFNGETTHEMEBOOL pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEBOOL)GetProc("GetThemeBool", (void*)GetThemeBoolFail);
return (*pfn)(hTheme, iPartId, iStateId, iPropId, pfVal);
}
HRESULT CVisualStylesXP::GetThemeInt(HTHEME hTheme, int iPartId,
int iStateId, int iPropId, int *piVal)
{
static PFNGETTHEMEINT pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEINT)GetProc("GetThemeInt", (void*)GetThemeIntFail);
return (*pfn)(hTheme, iPartId, iStateId, iPropId, piVal);
}
HRESULT CVisualStylesXP::GetThemeEnumValue(HTHEME hTheme, int iPartId,
int iStateId, int iPropId, int *piVal)
{
static PFNGETTHEMEENUMVALUE pfn = NULL;
if( !pfn )
pfn = (PFNGETTHEMEENUMVALUE)GetProc("GetThemeEnumValue", (void*)GetThemeEnumValueFail);
return (*pfn)(hTheme, iPartId, iStateId, iPropId, piVal);
}
HRESULT CVisualStylesXP::GetThemePosition(HTHEME hTheme, int iPartId,
int iStateId, int iPropId, POINT *pPoint)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -