winamp/Src/nu/windowsTheme.cpp
2024-09-24 14:54:57 +02:00

267 lines
10 KiB
C++

#include "./windowsTheme.h"
#include <shlwapi.h>
typedef UXTHEME (WINAPI *UXOPENTHEMEDATA)(HWND hwnd, LPCWSTR /*pszClassList*/);
typedef HRESULT (WINAPI *UXCLOSETHEMEDATA)(UXTHEME /*hTheme*/);
typedef HRESULT (WINAPI *UXSETWINDOWTHEME)(HWND /*hwnd*/, LPCWSTR /*pszSubAppName*/, LPCWSTR /*pszSubIdList*/);
typedef HRESULT (WINAPI *UXDRAWTHEMEBACKGROUND)(UXTHEME /*hTheme*/, HDC /*hdc*/, INT /*iPartId*/, INT /*iStateId*/,
LPCRECT /*pRect*/, LPCRECT /*pClipRect*/);
typedef HRESULT (WINAPI *UXDRAWTHEMEPARENTBACKGROUND)(HWND /*hwnd*/, HDC /*hdc*/, const RECT * /*prc*/);
typedef HRESULT (WINAPI *UXDRAWTHEMEPARENTBACKGROUNDEX)(HWND /*hwnd*/, HDC /*hdc*/, DWORD /*dwFlags*/, const RECT * /*prc*/);
typedef HRESULT (WINAPI *UXDRAWTHEMETEXT)(UXTHEME /*hTheme*/, HDC /*hdc*/, INT /*iPartId*/, INT /*iStateId*/,
LPCWSTR /*pszText*/, INT /*iCharCount*/, DWORD /*dwTextFlags*/,
DWORD /*dwTextFlags2*/, LPCRECT /*pRect*/);
typedef COLORREF (WINAPI *UXGETTHEMESYSCOLOR)(UXTHEME /*hTheme*/, INT /*iColorID*/);
typedef HRESULT (WINAPI *UXGETTHEMECOLOR)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPCOLORREF /*pColor*/);
typedef HRESULT (WINAPI *UXGETTHEMEINT)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPINT /*piVal*/);
typedef HRESULT (WINAPI *UXGETTHEMEMETRIC)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPINT /*piVal*/);
typedef HRESULT (WINAPI *UXGETTHEMEPARTSIZE)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, LPCRECT /*prc*/, UXTHEMESIZE /*eSize*/, LPSIZE /*psz*/);
typedef HRESULT (WINAPI *UXGETTHEMEBACKGROUNDCONTENTRECT)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, LPCRECT /*pBoundingRect*/, LPRECT /*pContentRect*/);
typedef HRESULT (WINAPI *UXENABLETHEMEDIALOGTEXTURE)(HWND /*hwnd*/, DWORD /*dwFlags*/);
typedef BOOL (WINAPI *UXISAPPTHEMED)(void);
typedef BOOL (WINAPI *UXISTHEMEACTIVE)(void);
typedef BOOL (WINAPI *UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/);
static UXOPENTHEMEDATA uxOpenThemeData = NULL;
static UXCLOSETHEMEDATA uxCloseThemeData = NULL;
static UXSETWINDOWTHEME uxSetWindowTheme = NULL;
static UXISAPPTHEMED uxIsAppThemed = NULL;
static UXISTHEMEACTIVE uxIsThemeActive = NULL;
static UXDRAWTHEMEBACKGROUND uxDrawThemeBackground = NULL;
static UXDRAWTHEMEPARENTBACKGROUND uxDrawThemeParentBackground = NULL;
static UXDRAWTHEMEPARENTBACKGROUNDEX uxDrawThemeParentBackgroundEx = NULL;
static UXDRAWTHEMETEXT uxDrawThemeText = NULL;
static UXGETTHEMESYSCOLOR uxGetThemeSysColor = NULL;
static UXGETTHEMECOLOR uxGetThemeColor = NULL;
static UXGETTHEMEINT uxGetThemeInt = NULL;
static UXGETTHEMEMETRIC uxGetThemeMetric = NULL;
static UXGETTHEMEPARTSIZE uxGetThemePartSize = NULL;
static UXGETTHEMEBACKGROUNDCONTENTRECT uxGetThemeBackgroundContentRect = NULL;
static UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT uxIsThemeBackgroundPartiallyTransparent = NULL;
static UXENABLETHEMEDIALOGTEXTURE uxEnableThemeDialogTexture = NULL;
static HMODULE uxModule = NULL;
static HRESULT uxLoadResult = E_WINTHEME_NOTLOADED;
static BOOL fSysCheckOk = -1;
static BOOL fComCtlCheckOk = -1;
#define UXTHEME_LOADCHECK(__uxFunction){\
if (NULL == uxModule && FAILED(UxTheme_LoadLibrary())) return uxLoadResult;\
if (NULL == (__uxFunction)) return E_WINTHEME_BADFUNCTION;}
#define UXTHEME_LOADCHECK_RESULT(__uxFunction, __failResult){\
if ((NULL == uxModule && FAILED(UxTheme_LoadLibrary())) || NULL == (__uxFunction))\
return (__failResult);}
HRESULT STDAPICALLTYPE UxTheme_LoadLibrary(void)
{
if (E_WINTHEME_NOTLOADED == uxLoadResult)
{
uxModule = LoadLibraryW(L"uxtheme.dll");
if (NULL == uxModule)
{
uxLoadResult = E_WINTHEME_LOADFAILED;
}
else
{
uxSetWindowTheme = (UXSETWINDOWTHEME)GetProcAddress(uxModule, "SetWindowTheme");
uxIsAppThemed = (UXISAPPTHEMED)GetProcAddress(uxModule, "IsAppThemed");
uxIsThemeActive = (UXISTHEMEACTIVE)GetProcAddress(uxModule, "IsThemeActive");
uxOpenThemeData = (UXOPENTHEMEDATA)GetProcAddress(uxModule, "OpenThemeData");
uxCloseThemeData = (UXCLOSETHEMEDATA)GetProcAddress(uxModule, "CloseThemeData");
uxDrawThemeBackground = (UXDRAWTHEMEBACKGROUND)GetProcAddress(uxModule, "DrawThemeBackground");
uxDrawThemeParentBackground = (UXDRAWTHEMEPARENTBACKGROUND)GetProcAddress(uxModule, "DrawThemeParentBackground");
uxDrawThemeParentBackgroundEx = (UXDRAWTHEMEPARENTBACKGROUNDEX)GetProcAddress(uxModule, "DrawThemeParentBackgroundEx");
uxDrawThemeText = (UXDRAWTHEMETEXT)GetProcAddress(uxModule, "DrawThemeText");
uxGetThemeSysColor = (UXGETTHEMESYSCOLOR)GetProcAddress(uxModule, "GetThemeSysColor");
uxGetThemeColor = (UXGETTHEMECOLOR)GetProcAddress(uxModule, "GetThemeColor");
uxGetThemeInt = (UXGETTHEMEINT)GetProcAddress(uxModule, "GetThemeInt");
uxGetThemeMetric = (UXGETTHEMEMETRIC)GetProcAddress(uxModule, "GetThemeMetric");
uxGetThemePartSize = (UXGETTHEMEPARTSIZE)GetProcAddress(uxModule, "GetThemePartSize");
uxGetThemeBackgroundContentRect = (UXGETTHEMEBACKGROUNDCONTENTRECT)GetProcAddress(uxModule, "GetThemeBackgroundContentRect");
uxIsThemeBackgroundPartiallyTransparent = (UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)GetProcAddress(uxModule, "IsThemeBackgroundPartiallyTransparent");
uxEnableThemeDialogTexture = (UXENABLETHEMEDIALOGTEXTURE)GetProcAddress(uxModule, "EnableThemeDialogTexture");
uxLoadResult = S_OK;
}
}
if (-1 == fSysCheckOk)
{
OSVERSIONINFOW vi;
vi.dwOSVersionInfoSize = sizeof(vi);
if (FALSE != GetVersionEx(&vi) &&
(vi.dwMajorVersion > 5 || (vi.dwMajorVersion == 5 && vi.dwMinorVersion > 0)))
{
fSysCheckOk = TRUE;
}
else
{
fSysCheckOk = FALSE;
}
}
if (-1 == fComCtlCheckOk)
{
fComCtlCheckOk = FALSE;
HMODULE hComCtl = LoadLibraryW(L"comctl32.dll");
if (NULL != hComCtl)
{
HRESULT (CALLBACK *waDllGetVersion)(DLLVERSIONINFO*) = (HRESULT (CALLBACK *)(DLLVERSIONINFO*))GetProcAddress(hComCtl, "DllGetVersion");
if (NULL != waDllGetVersion)
{
DLLVERSIONINFO dllVer;
dllVer.cbSize = sizeof(DLLVERSIONINFO);
if (S_OK == waDllGetVersion(&dllVer) && dllVer.dwMajorVersion >= 6)
{
fComCtlCheckOk = TRUE;
}
FreeLibrary(hComCtl);
}
}
}
return uxLoadResult;
}
HRESULT STDAPICALLTYPE UxTheme_IsThemeActive(void)
{
if (NULL == uxIsAppThemed)
{
if(FAILED(UxTheme_LoadLibrary()))
return uxLoadResult;
if (NULL == uxIsAppThemed) return E_WINTHEME_BADFUNCTION;
}
if (NULL == uxIsThemeActive)
{
if(FAILED(UxTheme_LoadLibrary()))
return uxLoadResult;
if (NULL == uxIsThemeActive) return E_WINTHEME_BADFUNCTION;
}
if (TRUE != fSysCheckOk || TRUE != fComCtlCheckOk ||
FALSE == uxIsAppThemed() || FALSE == uxIsThemeActive())
{
return S_FALSE;
}
return S_OK;
}
HRESULT STDAPICALLTYPE UxTheme_GetLoadResult(void)
{
return uxLoadResult;
}
UXTHEME STDAPICALLTYPE UxOpenThemeData(HWND hwnd, LPCWSTR pszClassList)
{
UXTHEME_LOADCHECK_RESULT(uxOpenThemeData, NULL);
return uxOpenThemeData(hwnd, pszClassList);
}
HRESULT STDAPICALLTYPE UxCloseThemeData(UXTHEME hTheme)
{
UXTHEME_LOADCHECK(uxCloseThemeData);
return uxCloseThemeData(hTheme);
}
HRESULT STDAPICALLTYPE UxSetWindowTheme(HWND hwnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList)
{
UXTHEME_LOADCHECK(uxSetWindowTheme);
return uxSetWindowTheme(hwnd, pszSubAppName, pszSubIdList);
}
BOOL STDAPICALLTYPE UxIsAppThemed(void)
{
UXTHEME_LOADCHECK_RESULT(uxIsAppThemed, FALSE);
return uxIsAppThemed();
}
BOOL STDAPICALLTYPE UxIsThemeActive(void)
{
UXTHEME_LOADCHECK_RESULT(UxIsThemeActive, FALSE);
return UxIsThemeActive();
}
HRESULT STDAPICALLTYPE UxDrawThemeBackground(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId,
const RECT *pRect, OPTIONAL const RECT *pClipRect)
{
UXTHEME_LOADCHECK(uxDrawThemeBackground);
return uxDrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, pClipRect);
}
HRESULT STDAPICALLTYPE UxDrawThemeParentBackground(HWND hwnd, HDC hdc, const RECT *prc)
{
UXTHEME_LOADCHECK(uxDrawThemeParentBackground);
return uxDrawThemeParentBackground(hwnd, hdc, prc);
}
HRESULT STDAPICALLTYPE UxDrawThemeParentBackgroundEx(HWND hwnd, HDC hdc, DWORD dwFlags, const RECT *prc)
{
UXTHEME_LOADCHECK(uxDrawThemeParentBackgroundEx);
return uxDrawThemeParentBackgroundEx(hwnd, hdc, dwFlags, prc);
}
HRESULT STDAPICALLTYPE UxDrawThemeText(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCWSTR pszText,
int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect)
{
UXTHEME_LOADCHECK(uxDrawThemeText);
return uxDrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect);
}
COLORREF STDAPICALLTYPE UxGetThemeSysColor(UXTHEME hTheme, int iColorID)
{
UXTHEME_LOADCHECK_RESULT(uxGetThemeSysColor, RGB(255, 0, 255));
return uxGetThemeSysColor(hTheme, iColorID);
}
HRESULT STDAPICALLTYPE UxGetThemeColor(UXTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
{
UXTHEME_LOADCHECK(uxGetThemeColor);
return uxGetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor);
}
HRESULT STDAPICALLTYPE UxGetThemeInt(UXTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
{
UXTHEME_LOADCHECK(uxGetThemeInt);
return uxGetThemeInt(hTheme, iPartId, iStateId, iPropId, piVal);
}
HRESULT STDAPICALLTYPE UxGetThemeMetric(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, int *piVal)
{
UXTHEME_LOADCHECK(uxGetThemeMetric);
return uxGetThemeMetric(hTheme, hdc, iPartId, iStateId, iPropId, piVal);
}
HRESULT STDAPICALLTYPE UxGetThemePartSize(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT prc, UXTHEMESIZE eSize, SIZE *psz)
{
UXTHEME_LOADCHECK(uxGetThemePartSize);
return uxGetThemePartSize(hTheme, hdc, iPartId, iStateId, prc, eSize, psz);
}
HRESULT STDAPICALLTYPE UxGetThemeBackgroundContentRect(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pBoundingRect, LPRECT pContentRect)
{
UXTHEME_LOADCHECK(uxGetThemeBackgroundContentRect);
return uxGetThemeBackgroundContentRect(hTheme, hdc, iPartId, iStateId, pBoundingRect, pContentRect);
}
BOOL STDAPICALLTYPE UxIsThemeBackgroundPartiallyTransparent(UXTHEME hTheme, int iPartId, int iStateId)
{
UXTHEME_LOADCHECK_RESULT(uxIsThemeBackgroundPartiallyTransparent, FALSE);
return uxIsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId);
}
HRESULT STDAPICALLTYPE UxEnableThemeDialogTexture(HWND hwnd, DWORD dwFlags)
{
UXTHEME_LOADCHECK(uxEnableThemeDialogTexture);
return uxEnableThemeDialogTexture(hwnd, dwFlags);
}