123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #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);
- }
|