You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
759 lines
20 KiB
C++
759 lines
20 KiB
C++
2 years ago
|
// XTPWinThemeWrapper.cpp: implementation of the CXTPWinThemeWrapper class.
|
||
|
//
|
||
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include "XTPWinThemeWrapper.h"
|
||
|
#include "XTPSystemHelpers.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#define new DEBUG_NEW
|
||
|
#endif
|
||
|
|
||
|
#pragma warning(disable: 4571) // warning C4571: catch(...) blocks compiled with /EHs do not catch or re-throw Structured Exceptions
|
||
|
|
||
|
|
||
|
#define TRY_POINTER_CALL(proc)\
|
||
|
try\
|
||
|
{\
|
||
|
CSharedData& sData = GetSharedData();\
|
||
|
if (sData.m_hThemeDll != NULL && sData.m_ptrWrappers[xtpWrapper##proc] == NULL)\
|
||
|
{\
|
||
|
sData.m_ptrWrappers[xtpWrapper##proc] = ::GetProcAddress(\
|
||
|
sData.m_hThemeDll, xtpWrapperProc##proc);\
|
||
|
}\
|
||
|
PFN##proc ptr = (PFN##proc)sData.m_ptrWrappers[xtpWrapper##proc];\
|
||
|
if (ptr)\
|
||
|
{
|
||
|
#define POINTER_CALL (*ptr)
|
||
|
#define CATCH_POINTER_CALL()\
|
||
|
}\
|
||
|
}\
|
||
|
catch (...)\
|
||
|
{\
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::m_bDllDetached = FALSE;
|
||
|
|
||
|
CXTPWinThemeWrapper::CSharedData::CSharedData()
|
||
|
{
|
||
|
m_dwComCtlVersion = XTPSystemVersion()->GetComCtlVersion();
|
||
|
ZeroMemory(&m_ptrWrappers, sizeof(m_ptrWrappers));
|
||
|
|
||
|
m_hThemeDll = ::LoadLibrary(_T("UXTHEME.DLL"));
|
||
|
}
|
||
|
|
||
|
CXTPWinThemeWrapper::CSharedData& CXTPWinThemeWrapper::GetSharedData() const
|
||
|
{
|
||
|
if (m_pSharedDara)
|
||
|
return (CSharedData&)*m_pSharedDara;
|
||
|
|
||
|
if (!m_bUseSkinFramework)
|
||
|
{
|
||
|
static CSharedData sDataSystem;
|
||
|
return sDataSystem;
|
||
|
}
|
||
|
|
||
|
static CSharedData sData;
|
||
|
return sData;
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::CreateSharedData()
|
||
|
{
|
||
|
SAFE_DELETE(m_pSharedDara);
|
||
|
m_pSharedDara = new CSharedData();
|
||
|
}
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// CXTPWinThemeWrapper class
|
||
|
//===========================================================================
|
||
|
|
||
|
CXTPWinThemeWrapper::CXTPWinThemeWrapper(BOOL bUseSkinFramework)
|
||
|
: m_hTheme(NULL), m_bUseSkinFramework(bUseSkinFramework), m_pSharedDara(0)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
CXTPWinThemeWrapper::~CXTPWinThemeWrapper()
|
||
|
{
|
||
|
CloseThemeData();
|
||
|
|
||
|
SAFE_DELETE(m_pSharedDara);
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::ReloadLibrary() const
|
||
|
{
|
||
|
if (!m_bUseSkinFramework)
|
||
|
return;
|
||
|
|
||
|
HMODULE hThemeDll = GetModuleHandleA("UXTHEME.DLL");
|
||
|
|
||
|
CSharedData& sData = GetSharedData();
|
||
|
if (hThemeDll != sData.m_hThemeDll)
|
||
|
{
|
||
|
sData.m_hThemeDll = hThemeDll;
|
||
|
ZeroMemory(&sData.m_ptrWrappers, sizeof(sData.m_ptrWrappers));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::SetThemeWrapperPtr(int nThemeWrapper, LPVOID lpWrapperPtr)
|
||
|
{
|
||
|
GetSharedData().m_ptrWrappers[nThemeWrapper] = lpWrapperPtr;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPWinThemeWrapper::CloseThemeData()
|
||
|
{
|
||
|
if (m_hTheme && !m_bDllDetached)
|
||
|
{
|
||
|
TRY_POINTER_CALL(CloseThemeData)
|
||
|
POINTER_CALL(m_hTheme);
|
||
|
CATCH_POINTER_CALL()
|
||
|
}
|
||
|
|
||
|
m_hTheme = NULL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeBackground(HDC hDC, int iPartID, int iStateID, const RECT* pRect, const RECT* pClipRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeBackground);
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pRect, pClipRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeBackgroundEx(HDC hDC, int iPartID, int iStateID, const RECT* pRect, const PDTBGOPTS pOptions)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeBackgroundEx)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pRect, pOptions);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeEdge(HDC hDC, int iPartID, int iStateID, const RECT* pDestRect, UINT uEdge, UINT uFlags, RECT* pContentRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeEdge)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pDestRect, uEdge, uFlags, pContentRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeIcon(HDC hDC, int iPartID, int iStateID, const RECT* pRect, HIMAGELIST himl, int iImageIndex)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeIcon)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pRect, himl, iImageIndex);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeParentBackground(HWND hWnd, HDC hDC, RECT* pRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeParentBackground)
|
||
|
return POINTER_CALL(hWnd, hDC, pRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeText(HDC hDC, int iPartID, int iStateID, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT* pRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeText)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::EnableThemeDialogTexture(HWND hWnd, DWORD dwFlags)
|
||
|
{
|
||
|
TRY_POINTER_CALL(EnableThemeDialogTexture)
|
||
|
return POINTER_CALL(hWnd, dwFlags);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::EnableTheming(BOOL fEnable)
|
||
|
{
|
||
|
TRY_POINTER_CALL(EnableTheming)
|
||
|
return POINTER_CALL(fEnable);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars)
|
||
|
{
|
||
|
ReloadLibrary();
|
||
|
|
||
|
TRY_POINTER_CALL(GetCurrentThemeName)
|
||
|
return POINTER_CALL(pszThemeFileName, dwMaxNameChars, pszColorBuff, cchMaxColorChars, pszSizeBuff, cchMaxSizeChars);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
DWORD CXTPWinThemeWrapper::ThemeAppProperties()
|
||
|
{
|
||
|
TRY_POINTER_CALL(ThemeAppProperties)
|
||
|
return POINTER_CALL();
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return 0L;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeBackgroundContentRect(HDC hDC, int iPartID, int iStateID, const RECT* pBoundingRect, RECT* pContentRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeBackgroundContentRect)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pBoundingRect, pContentRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeBackgroundExtent(HDC hDC, int iPartID, int iStateID, const RECT* pContentRect, RECT* pExtentRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeBackgroundExtent)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pContentRect, pExtentRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeBackgroundRegion(HDC hDC, int iPartID, int iStateID, const RECT* pRect, HRGN* pRegion)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeBackgroundRegion)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pRect, pRegion);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeBool(int iPartID, int iStateID, int iPropID, BOOL* pfVal)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeBool)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pfVal);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeColor(int iPartID, int iStateID, int iPropID, COLORREF* pColor)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeColor)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pColor);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeDocumentationProperty(LPCWSTR pszThemeName, LPCWSTR pszPropertyName, LPWSTR pszValueBuff, int cchMaxValChars)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeDocumentationProperty)
|
||
|
return POINTER_CALL(pszThemeName, pszPropertyName, pszValueBuff, cchMaxValChars);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeEnumValue(int iPartID, int iStateID, int iPropID, int* piVal)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeEnumValue)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, piVal);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeFilename(int iPartID, int iStateID, int iPropID, LPWSTR pszThemeFilename, int cchMaxBuffChars)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeFilename)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pszThemeFilename, cchMaxBuffChars);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeFont(HDC hDC, int iPartID, int iStateID, int iPropID, LOGFONT* pFont)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeFont)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, iPropID, pFont);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeInt(int iPartID, int iStateID, int iPropID, int* piVal)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeInt)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, piVal);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeIntList(int iPartID, int iStateID, int iPropID, INTLIST* pIntList)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeIntList)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pIntList);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeMargins(HDC hDC, int iPartID, int iStateID, int iPropID, RECT* pRect, MARGINS* pMargins)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeMargins)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, iPropID, pRect, pMargins);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeMetric(HDC hDC, int iPartID, int iStateID, int iPropID, int* piVal)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeMetric)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, iPropID, piVal);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemePartSize(HDC hDC, int iPartID, int iStateID, RECT* pRect, THEMESIZE eSize, SIZE* pSize)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemePartSize)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pRect, eSize, pSize);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemePosition(int iPartID, int iStateID, int iPropID, POINT* pPoint)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemePosition)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pPoint);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemePropertyOrigin(int iPartID, int iStateID, int iPropID, PROPERTYORIGIN* pOrigin)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemePropertyOrigin)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pOrigin);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeRect(int iPartID, int iStateID, int iPropID, RECT* pRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeRect)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeString(int iPartID, int iStateID, int iPropID, LPWSTR pszBuff, int cchMaxBuffChars)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeString)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID, iPropID, pszBuff, cchMaxBuffChars);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::GetThemeSysBool(int iBoolID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysBool)
|
||
|
return POINTER_CALL(m_hTheme, iBoolID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
COLORREF CXTPWinThemeWrapper::GetThemeSysColor(int iColorID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysColor)
|
||
|
return POINTER_CALL(m_hTheme, iColorID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return (COLORREF)-1;
|
||
|
}
|
||
|
|
||
|
HBRUSH CXTPWinThemeWrapper::GetThemeSysColorBrush(int iColorID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysColorBrush)
|
||
|
return POINTER_CALL(m_hTheme, iColorID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeSysFont(int iFontID, LOGFONT* pLF)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysFont)
|
||
|
return POINTER_CALL(m_hTheme, iFontID, pLF);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeSysInt(int iIntID, int* piValue)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysInt)
|
||
|
return POINTER_CALL(m_hTheme, iIntID, piValue);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
int CXTPWinThemeWrapper::GetThemeSysSize(int iSizeID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysSize)
|
||
|
return POINTER_CALL(m_hTheme, iSizeID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeSysString(int iStringID, LPWSTR pszStringBuff, int cchMaxStringChars)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeSysString)
|
||
|
return POINTER_CALL(m_hTheme, iStringID, pszStringBuff, cchMaxStringChars);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeTextExtent(HDC hDC, int iPartID, int iStateID, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, const RECT* pBoundingRect, RECT* pExtentRect)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeTextExtent)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, pszText, iCharCount, dwTextFlags, pBoundingRect, pExtentRect);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::GetThemeTextMetrics(HDC hDC, int iPartID, int iStateID, TEXTMETRIC* ptm)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeTextMetrics)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, ptm);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HTHEME CXTPWinThemeWrapper::GetWindowTheme(HWND hWnd)
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetWindowTheme)
|
||
|
return POINTER_CALL(hWnd);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::HitTestThemeBackground(HDC hDC, int iPartID, int iStateID, DWORD dwOptions, const RECT* pRect, HRGN hRgn, POINT ptTest, WORD* pwHitTestCode)
|
||
|
{
|
||
|
TRY_POINTER_CALL(HitTestThemeBackground)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartID, iStateID, dwOptions, pRect, hRgn, ptTest, pwHitTestCode);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsAppThemed() const
|
||
|
{
|
||
|
if (!m_hTheme)
|
||
|
return FALSE;
|
||
|
|
||
|
TRY_POINTER_CALL(IsAppThemed)
|
||
|
return POINTER_CALL();
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsThemeActive() const
|
||
|
{
|
||
|
if (m_hTheme == 0)
|
||
|
{
|
||
|
ReloadLibrary();
|
||
|
}
|
||
|
|
||
|
TRY_POINTER_CALL(IsThemeActive)
|
||
|
return POINTER_CALL();
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsThemeBackgroundPartiallyTransparent(int iPartID, int iStateID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(IsThemeBackgroundPartiallyTransparent)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsThemeDialogTextureEnabled(HWND hWnd)
|
||
|
{
|
||
|
TRY_POINTER_CALL(IsThemeDialogTextureEnabled)
|
||
|
return POINTER_CALL(hWnd);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsThemePartDefined(int iPartID, int iStateID)
|
||
|
{
|
||
|
TRY_POINTER_CALL(IsThemePartDefined)
|
||
|
return POINTER_CALL(m_hTheme, iPartID, iStateID);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::OpenThemeData(HWND hWnd, LPCWSTR pszClassList)
|
||
|
{
|
||
|
ReloadLibrary();
|
||
|
|
||
|
CloseThemeData();
|
||
|
|
||
|
TRY_POINTER_CALL(OpenThemeData)
|
||
|
m_hTheme = POINTER_CALL(hWnd, pszClassList);
|
||
|
CATCH_POINTER_CALL()
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::SetThemeAppProperties(DWORD dwFlags)
|
||
|
{
|
||
|
TRY_POINTER_CALL(SetThemeAppProperties)
|
||
|
POINTER_CALL(dwFlags);
|
||
|
CATCH_POINTER_CALL()
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::SetWindowTheme(HWND hWnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList)
|
||
|
{
|
||
|
TRY_POINTER_CALL(SetWindowTheme)
|
||
|
return POINTER_CALL(hWnd, pszSubAppName, pszSubIdList);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
DWORD CXTPWinThemeWrapper::GetThemeAppProperties()
|
||
|
{
|
||
|
TRY_POINTER_CALL(GetThemeAppProperties)
|
||
|
return POINTER_CALL();
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::ThemeDataOpen() const
|
||
|
{
|
||
|
return (m_hTheme != NULL);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinThemeWrapper::IsAppThemeReady() const
|
||
|
{
|
||
|
// This will fail when using Windows "classic" or any non
|
||
|
// theme mode the system themes are not available to use.
|
||
|
|
||
|
if (!IsThemeActive())
|
||
|
return FALSE;
|
||
|
|
||
|
if (GetSharedData().m_hThemeDll == XTP_UXTHEME_HANDLE)
|
||
|
return TRUE;
|
||
|
|
||
|
// By loading the comctl32.dll, we can determine if the application
|
||
|
// has a manifest file because the application will load comctl32.dll
|
||
|
// version 6.0 (or greater). If it does not contain a manifest file
|
||
|
// the application will load version 5.0 or earlier.
|
||
|
|
||
|
// Our application is able to display Windows XP themes.
|
||
|
if (HIWORD(GetSharedData().m_dwComCtlVersion) > 5)
|
||
|
return TRUE;
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
/// Vista
|
||
|
|
||
|
HRESULT CXTPWinThemeWrapper::DrawThemeTextEx(HDC hDC, int iPartId, int iStateId, LPCWSTR pszText, int cchText, DWORD dwTextFlags, LPRECT pRect, const XTP_UX_DTTOPTS *pOptions)
|
||
|
{
|
||
|
TRY_POINTER_CALL(DrawThemeTextEx)
|
||
|
return POINTER_CALL(m_hTheme, hDC, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HPAINTBUFFER CXTPWinThemeWrapper::BeginBufferedPaint(HDC hdcTarget, const RECT* prcTarget, XTP_UX_BUFFERFORMAT dwFormat, XTP_UX_PAINTPARAMS *pPaintParams, HDC *phdc)
|
||
|
{
|
||
|
TRY_POINTER_CALL(BeginBufferedPaint)
|
||
|
return POINTER_CALL(hdcTarget, prcTarget, dwFormat, pPaintParams, phdc);
|
||
|
CATCH_POINTER_CALL()
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void CXTPWinThemeWrapper::EndBufferedPaint(HPAINTBUFFER hBufferedPaint, BOOL fUpdateTarget)
|
||
|
{
|
||
|
TRY_POINTER_CALL(EndBufferedPaint)
|
||
|
POINTER_CALL(hBufferedPaint, fUpdateTarget);
|
||
|
CATCH_POINTER_CALL()
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
CXTPWinDwmWrapper::CSharedData::CSharedData()
|
||
|
{
|
||
|
ZeroMemory(&m_ptrWrappers, sizeof(m_ptrWrappers));
|
||
|
m_hDwmDll = ::LoadLibrary(_T("dwmapi.dll"));
|
||
|
}
|
||
|
|
||
|
|
||
|
CXTPWinDwmWrapper::CSharedData& CXTPWinDwmWrapper::GetSharedData() const
|
||
|
{
|
||
|
static CSharedData sData;
|
||
|
return sData;
|
||
|
}
|
||
|
|
||
|
|
||
|
CXTPWinDwmWrapper::CXTPWinDwmWrapper()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
CXTPWinDwmWrapper::~CXTPWinDwmWrapper()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL CXTPWinDwmWrapper::IsCompositionEnabled()
|
||
|
{
|
||
|
CSharedData& sData = GetSharedData();
|
||
|
if (sData.m_hDwmDll != NULL && sData.m_ptrWrappers[xtpWrapperDwmIsCompositionEnabled] == NULL)
|
||
|
{
|
||
|
sData.m_ptrWrappers[xtpWrapperDwmIsCompositionEnabled] = ::GetProcAddress(
|
||
|
sData.m_hDwmDll, xtpWrapperProcDwmIsCompositionEnabled);
|
||
|
}
|
||
|
|
||
|
PFNDwmIsCompositionEnabled ptr = (PFNDwmIsCompositionEnabled)sData.m_ptrWrappers[xtpWrapperDwmIsCompositionEnabled];
|
||
|
if (ptr)
|
||
|
{
|
||
|
BOOL bEnabled = FALSE;
|
||
|
LRESULT lResult = (*ptr)(&bEnabled);
|
||
|
if (FAILED(lResult))
|
||
|
return FALSE;
|
||
|
|
||
|
return bEnabled;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinDwmWrapper::DefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
|
||
|
{
|
||
|
CSharedData& sData = GetSharedData();
|
||
|
if (sData.m_hDwmDll != NULL && sData.m_ptrWrappers[xtpWrapperDwmDefWindowProc] == NULL)
|
||
|
{
|
||
|
sData.m_ptrWrappers[xtpWrapperDwmDefWindowProc] = ::GetProcAddress(
|
||
|
sData.m_hDwmDll, xtpWrapperProcDwmDefWindowProc);
|
||
|
}
|
||
|
|
||
|
PFNDwmDefWindowProc ptr = (PFNDwmDefWindowProc)sData.m_ptrWrappers[xtpWrapperDwmDefWindowProc];
|
||
|
if (ptr)
|
||
|
{
|
||
|
return (*ptr)(hWnd, msg, wParam, lParam, plResult);
|
||
|
}
|
||
|
return E_FAIL;
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPWinDwmWrapper::ExtendFrameIntoClientArea(HWND hWnd, int cxLeftWidth, int cyTopHeight, int cxRightWidth, int cyBottomHeight)
|
||
|
{
|
||
|
CSharedData& sData = GetSharedData();
|
||
|
if (sData.m_hDwmDll != NULL && sData.m_ptrWrappers[xtpWrapperDwmExtendFrameIntoClientArea] == NULL)
|
||
|
{
|
||
|
sData.m_ptrWrappers[xtpWrapperDwmExtendFrameIntoClientArea] = ::GetProcAddress(
|
||
|
sData.m_hDwmDll, xtpWrapperProcDwmExtendFrameIntoClientArea);
|
||
|
}
|
||
|
|
||
|
PFNDwmExtendFrameIntoClientArea ptr = (PFNDwmExtendFrameIntoClientArea)sData.m_ptrWrappers[xtpWrapperDwmExtendFrameIntoClientArea];
|
||
|
if (ptr)
|
||
|
{
|
||
|
XTP_DWM_MARGINS margins;
|
||
|
margins.cxLeftWidth = cxLeftWidth;
|
||
|
margins.cyTopHeight = cyTopHeight;
|
||
|
margins.cxRightWidth = cxRightWidth;
|
||
|
margins.cyBottomHeight = cyBottomHeight;
|
||
|
|
||
|
return (*ptr)(hWnd, &margins);
|
||
|
}
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
void CXTPWinDwmWrapper::LogicalToPhysicalPoint(HWND hWnd, LPPOINT lpPoint)
|
||
|
{
|
||
|
HMODULE hModule = GetModuleHandle(_T("user32.dll"));
|
||
|
ASSERT(hModule);
|
||
|
if (!hModule)
|
||
|
return;
|
||
|
|
||
|
typedef void (WINAPI* PFNLOGICALTOPHYSICALPOINT)(HWND, LPPOINT);
|
||
|
PFNLOGICALTOPHYSICALPOINT pfnLogicalToPhysicalPoint =
|
||
|
(PFNLOGICALTOPHYSICALPOINT)GetProcAddress(hModule, "LogicalToPhysicalPoint");
|
||
|
if (pfnLogicalToPhysicalPoint)
|
||
|
{
|
||
|
pfnLogicalToPhysicalPoint(hWnd, lpPoint);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPWinDwmWrapper::SetProcessDPIAware()
|
||
|
{
|
||
|
HMODULE hModule = GetModuleHandle(_T("user32.dll"));
|
||
|
ASSERT(hModule);
|
||
|
if (!hModule)
|
||
|
return;
|
||
|
|
||
|
typedef void (WINAPI* PFNSETPROCESSDPIAWARE)();
|
||
|
PFNSETPROCESSDPIAWARE pfnSetProcessDPIAware =
|
||
|
(PFNSETPROCESSDPIAWARE)GetProcAddress(hModule, "SetProcessDPIAware");
|
||
|
if (pfnSetProcessDPIAware)
|
||
|
{
|
||
|
pfnSetProcessDPIAware();
|
||
|
}
|
||
|
}
|