diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2019-04-28 16:14:12 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2019-04-28 16:14:12 +0200 |
| commit | d64290aaffd4721518747713929d79a78ba963f4 (patch) | |
| tree | b891c41a49b5d5ad2ba3ba85e87fea262cb949c1 /alf/alfcompat.cpp | |
| parent | 6b301ea64ca71777e38611d8c49dd119808b4365 (diff) | |
add owner-drawn themed button with animation
Diffstat (limited to 'alf/alfcompat.cpp')
| -rw-r--r-- | alf/alfcompat.cpp | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 2260ed4..c0e11ba 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -358,6 +358,346 @@ ALF_Compat_loadSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvP return ALF_Compat_SystemParametersInfoForDpi(uiAction, uiParam, pvParam, fWinIni, dpi); } +static HTHEME WINAPI +ALF_Compat_fallbackOpenThemeData(HWND window, LPCWSTR classNames) +{ + (void)window; + (void)classNames; + + return NULL; +} + +static HTHEME WINAPI +ALF_Compat_loadOpenThemeData(HWND window, LPCWSTR classNames) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "OpenThemeData"); + if (!p) + p = (void*)ALF_Compat_fallbackOpenThemeData; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_OpenThemeData, p, (void*)ALF_Compat_loadOpenThemeData); + + return ALF_Compat_OpenThemeData(window, classNames); +} + +static HRESULT WINAPI +ALF_Compat_fallbackCloseThemeData(HTHEME hTheme) +{ + (void)hTheme; + + return S_OK; +} + +static HRESULT WINAPI +ALF_Compat_loadCloseThemeData(HTHEME hTheme) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "CloseThemeData"); + if (!p) + p = (void*)ALF_Compat_fallbackCloseThemeData; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_CloseThemeData, p, (void*)ALF_Compat_loadCloseThemeData); + + return ALF_Compat_CloseThemeData(hTheme); +} + +static BOOL WINAPI +ALF_Compat_fallbackIsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, int iStateId) +{ + (void)hTheme; (void)iPartId; (void)iStateId; + + return TRUE; +} + +static BOOL WINAPI +ALF_Compat_loadIsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, int iStateId) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "IsThemeBackgroundPartiallyTransparent"); + if (!p) + p = (void*)ALF_Compat_fallbackIsThemeBackgroundPartiallyTransparent; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_IsThemeBackgroundPartiallyTransparent, p, (void*)ALF_Compat_loadIsThemeBackgroundPartiallyTransparent); + + return ALF_Compat_IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId); +} + +static HRESULT WINAPI +ALF_Compat_fallbackDrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc) +{ + (void)hwnd; + (void)hdc; + (void)prc; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadDrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeParentBackground"); + if (!p) + p = (void*)ALF_Compat_fallbackDrawThemeParentBackground; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeParentBackground, p, (void*)ALF_Compat_loadDrawThemeParentBackground); + + return ALF_Compat_DrawThemeParentBackground(hwnd, hdc, prc); +} + +static HRESULT WINAPI +ALF_Compat_fallbackDrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect) +{ + (void)hTheme; + (void)hdc; + (void)iPartId; + (void)iStateId; + (void)pRect; + (void)pClipRect; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadDrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeBackground"); + if (!p) + p = (void*)ALF_Compat_fallbackDrawThemeBackground; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeBackground, p, (void*)ALF_Compat_loadDrawThemeBackground); + + return ALF_Compat_DrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, pClipRect); +} + +static HRESULT WINAPI +ALF_Compat_fallbackGetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pBoundingRect, RECT *pContentRect) +{ + (void)hTheme; + (void)hdc; + (void)iPartId; + (void)iStateId; + (void)pBoundingRect; + (void)pContentRect; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadGetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc, int iPArtId, int iStateId, const RECT *pBoundingRect, RECT *pContentRect) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeBackgroundContentRect"); + if (!p) + p = (void*)ALF_Compat_fallbackGetThemeBackgroundContentRect; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeBackgroundContentRect, p, (void*)ALF_Compat_loadGetThemeBackgroundContentRect); + + return ALF_Compat_GetThemeBackgroundContentRect(hTheme, hdc, iPArtId, iStateId, pBoundingRect, pContentRect); +} + +static HRESULT WINAPI +ALF_Compat_fallbackGetThemeTextExtent(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, LPCWSTR pszText, int iCharCount, + DWORD dwTextFlags, const RECT *pBoundingRect, + RECT *pExtentRect) +{ + (void)hTheme; (void)hdc; (void)iPartId; (void)iStateId; (void)pszText; + (void)iCharCount; (void)dwTextFlags; (void)pBoundingRect; (void)pExtentRect; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadGetThemeTextExtent(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, LPCWSTR pszText, int iCharCount, + DWORD dwTextFlags, const RECT *pBoundingRect, + RECT *pExtentRect) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeTextExtent"); + if (!p) + p = (void*)ALF_Compat_fallbackGetThemeTextExtent; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeTextExtent, p, (void*)ALF_Compat_loadGetThemeTextExtent); + + return ALF_Compat_GetThemeTextExtent(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, pBoundingRect, pExtentRect); +} + +static HRESULT WINAPI +ALF_Compat_fallbackDrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, + DWORD dwTextFlags2, const RECT *pRect) +{ + (void)hTheme; (void)hdc; (void)iPartId; (void)iStateId; (void)pszText; + (void)iCharCount; (void)dwTextFlags; (void)dwTextFlags2; (void)pRect; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadDrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, + DWORD dwTextFlags2, const RECT *pRect) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeText"); + if (!p) + p = (void*)ALF_Compat_fallbackDrawThemeText; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeText, p, (void*)ALF_Compat_loadDrawThemeText); + + return ALF_Compat_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect); +} + +static BOOL WINAPI +ALF_Compat_fallbackTrackMouseEvent(LPTRACKMOUSEEVENT tme) +{ + (void)tme; + + return FALSE; +} + +static BOOL WINAPI +ALF_Compat_loadTrackMouseEvent(LPTRACKMOUSEEVENT tme) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("comctl32.dll"), "_TrackMouseEvent"); + if (!p) + p = (void*)ALF_Compat_fallbackTrackMouseEvent; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_TrackMouseEvent, p, (void*)ALF_Compat_loadTrackMouseEvent); + + return ALF_Compat_TrackMouseEvent(tme); +} + +static HRESULT WINAPI +ALF_Compat_fallbackBufferedPaintInit(void) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadBufferedPaintInit(void) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintInit"); + if (!p) + p = (void*)ALF_Compat_fallbackBufferedPaintInit; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintInit, p, (void*)ALF_Compat_loadBufferedPaintInit); + + return ALF_Compat_BufferedPaintInit(); +} + +static HRESULT WINAPI +ALF_Compat_fallbackBufferedPaintUnInit(void) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadBufferedPaintUnInit(void) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintUnInit"); + if (!p) + p = (void*)ALF_Compat_fallbackBufferedPaintUnInit; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintUnInit, p, (void*)ALF_Compat_loadBufferedPaintUnInit); + + return ALF_Compat_BufferedPaintUnInit(); +} + +static ALF_Compat_HANIMATIONBUFFER WINAPI +ALF_Compat_fallbackBeginBufferedAnimation(HWND hwnd, HDC hdcTarget, + const RECT *prcTarget, DWORD dwFormat, + ALF_Compat_BP_PAINTPARAMS *pPaintParams, + ALF_Compat_BP_ANIMATIONPARAMS *pAnimationParams, + HDC *phdcFrom, HDC *phdcTo) +{ + (void)hwnd; (void)hdcTarget; (void)prcTarget; (void)dwFormat; + (void)pPaintParams; (void)pAnimationParams; (void)phdcFrom; (void)phdcTo; + + return NULL; +} + +static ALF_Compat_HANIMATIONBUFFER WINAPI +ALF_Compat_loadBeginBufferedAnimation(HWND hwnd, HDC hdcTarget, + const RECT *prcTarget, DWORD dwFormat, + ALF_Compat_BP_PAINTPARAMS *pPaintParams, + ALF_Compat_BP_ANIMATIONPARAMS *pAnimationParams, + HDC *phdcFrom, HDC *phdcTo) +{ + void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BeginBufferedAnimation"); + if (!p) + p = (void*)ALF_Compat_fallbackBeginBufferedAnimation; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_BeginBufferedAnimation, p, (void*)ALF_Compat_loadBeginBufferedAnimation); + + return ALF_Compat_BeginBufferedAnimation(hwnd, hdcTarget, prcTarget, dwFormat, pPaintParams, pAnimationParams, phdcFrom, phdcTo); +} + +static HRESULT WINAPI +ALF_Compat_fallbackEndBufferedAnimation(ALF_Compat_HANIMATIONBUFFER hbpAnimation, BOOL fUpdateTarget) +{ + (void)hbpAnimation; (void)fUpdateTarget; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadEndBufferedAnimation(ALF_Compat_HANIMATIONBUFFER hbpAnimation, BOOL fUpdateTarget) +{ + void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "EndBufferedAnimation"); + if (!p) + p = (void*)ALF_Compat_fallbackEndBufferedAnimation; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_EndBufferedAnimation, p, (void*)ALF_Compat_loadEndBufferedAnimation); + + return ALF_Compat_EndBufferedAnimation(hbpAnimation, fUpdateTarget); +} + +static BOOL WINAPI +ALF_Compat_fallbackBufferedPaintRenderAnimation(HWND hwnd, HDC hdc) +{ + (void)hwnd; (void)hdc; + + return FALSE; +} + +static BOOL WINAPI +ALF_Compat_loadBufferedPaintRenderAnimation(HWND hwnd, HDC hdc) +{ + void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintRenderAnimation"); + if (!p) + p = (void *)ALF_Compat_fallbackBufferedPaintRenderAnimation; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintRenderAnimation, p, (void*)ALF_Compat_loadBufferedPaintRenderAnimation); + + return ALF_Compat_BufferedPaintRenderAnimation(hwnd, hdc); +} + +static HRESULT WINAPI +ALF_Compat_fallbackGetThemeTransitionDuration(HTHEME hTheme, + int iPartId, + int iStateIdFrom, + int iStateIdTo, + int iPropId, + DWORD *pdwDuration) +{ + (void)hTheme; (void)iPartId; (void)iStateIdFrom; (void)iStateIdTo; (void)iPropId; (void)pdwDuration; + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ALF_Compat_loadGetThemeTransitionDuration(HTHEME hTheme, + int iPartId, + int iStateIdFrom, + int iStateIdTo, + int iPropId, + DWORD *pdwDuration) +{ + void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeTransitionDuration"); + + if (!p) + p = (void*)ALF_Compat_fallbackGetThemeTransitionDuration; + + InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeTransitionDuration, p, (void*)ALF_Compat_loadGetThemeTransitionDuration); + + return ALF_Compat_GetThemeTransitionDuration(hTheme, iPartId, iStateIdFrom, iStateIdTo, iPropId, pdwDuration); +} BOOL (WINAPI *ALF_Compat_IsAppThemed)(void) = ALF_Compat_loadIsAppThemed; UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND /*window*/) = ALF_Compat_loadGetDpiForWindow; @@ -373,3 +713,19 @@ BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT) #else BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT) = ALF_Compat_fallbackSystemParametersInfoForDpi; #endif + +HTHEME (WINAPI *ALF_Compat_OpenThemeData)(HWND, LPCWSTR) = ALF_Compat_loadOpenThemeData; +HRESULT (WINAPI *ALF_Compat_CloseThemeData)(HTHEME) = ALF_Compat_loadCloseThemeData; +BOOL (WINAPI *ALF_Compat_IsThemeBackgroundPartiallyTransparent)(HTHEME,int,int) = ALF_Compat_loadIsThemeBackgroundPartiallyTransparent; +HRESULT (WINAPI *ALF_Compat_DrawThemeParentBackground)(HWND,HDC,RECT *) = ALF_Compat_loadDrawThemeParentBackground; +HRESULT (WINAPI *ALF_Compat_DrawThemeBackground)(HTHEME, HDC, int, int, const RECT *, const RECT *) = ALF_Compat_loadDrawThemeBackground; +HRESULT (WINAPI *ALF_Compat_GetThemeBackgroundContentRect)(HTHEME,HDC,int,int,const RECT *,RECT *) = ALF_Compat_loadGetThemeBackgroundContentRect; +HRESULT (WINAPI *ALF_Compat_GetThemeTextExtent)(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,const RECT *, RECT *) = ALF_Compat_loadGetThemeTextExtent; +HRESULT (WINAPI *ALF_Compat_DrawThemeText)(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD,const RECT *) = ALF_Compat_loadDrawThemeText; +BOOL (WINAPI *ALF_Compat_TrackMouseEvent)(LPTRACKMOUSEEVENT tme) = ALF_Compat_loadTrackMouseEvent; +HRESULT (WINAPI *ALF_Compat_BufferedPaintInit)(void) = ALF_Compat_loadBufferedPaintInit; +HRESULT (WINAPI *ALF_Compat_BufferedPaintUnInit)(void) = ALF_Compat_loadBufferedPaintUnInit; +ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(HWND,HDC,const RECT *,DWORD,ALF_Compat_BP_PAINTPARAMS *,ALF_Compat_BP_ANIMATIONPARAMS *,HDC *,HDC *) = ALF_Compat_loadBeginBufferedAnimation; +HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL) = ALF_Compat_loadEndBufferedAnimation; +BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC) = ALF_Compat_loadBufferedPaintRenderAnimation; +HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*) = ALF_Compat_loadGetThemeTransitionDuration; |
