HRESULT DrawThemesPart(HDC hDC, int iPartId, int iStateId, LPCSTR uiPartNameID, LPRECT prcBox) { if(!IsWinXP()) return E_FAIL; HINSTANCE hDll=LoadLibrary(CString((LPCTSTR)IDS_UTIL_UXTHEME)); // 'UxTheme.dll' if(!hDll) return E_FAIL; BOOL (PASCAL* pfnIsThemeActive)(); UINT hTheme=0; (FARPROC&)pfnIsThemeActive=GetProcAddress(hDll,IDS_UTIL_THEMEACT); // 'IsThemeActive' HRESULT hResult=E_FAIL; if(pfnIsThemeActive && pfnIsThemeActive()) { CString sPartName((LPCTSTR)uiPartNameID); if(sPartName.GetLength()>0) { WCHAR swPartName[WPART_NAME_SZ]; #if !defined(UNICODE) && !defined(_UNICODE) MultiByteToWideChar(CP_ACP,0,(LPCSTR)sPartName,-1,swPartName,sizeof(swPartName)/sizeof(WCHAR)); #else _tcscpy(swPartName, sPartName.GetBuffer()); #endif UINT (PASCAL* pfnOpenThemeData)(HWND hwnd, LPCWSTR pszClassList); (FARPROC&)pfnOpenThemeData=GetProcAddress(hDll,IDS_UTIL_THEMEOPN);// 'OpenThemeData' if(pfnOpenThemeData && (hTheme=pfnOpenThemeData(NULL, swPartName))!=0) { UINT (PASCAL* pfnDrawThemeBackground)(UINT htheme,HDC hdc,int iPartID,int iStateID,const RECT* prcBx,const RECT* prcClip); (FARPROC&)pfnDrawThemeBackground=GetProcAddress(hDll,IDS_UTIL_THEMEBCKG); // 'DrawThemeBackground' if(pfnDrawThemeBackground) hResult=pfnDrawThemeBackground(hTheme, hDC, iPartId, iStateId, prcBox, NULL); } } } FreeLibrary(hDll); return hResult; }
//---------------------------------------------------------------------------------------------------------- BOOL IsThemeActiveEx() { // check theme activity always (could change during application running) HINSTANCE hDll=LoadLibrary(CString((LPCTSTR)IDS_UTIL_UXTHEME)); // 'UxTheme.dll' if(hDll==NULL) return FALSE; // the DLL won't be available on anything except Windows XP UINT (PASCAL *pfnIsThemeActive)(); (FARPROC&)pfnIsThemeActive=GetProcAddress(hDll,IDS_UTIL_THEMEACT); // 'IsThemeActive' UINT uiThemeActive=0; if(pfnIsThemeActive) uiThemeActive=pfnIsThemeActive(); FreeLibrary(hDll); return uiThemeActive?TRUE:FALSE; }
/** * update system's state (theme status, aero status, DWM check... * * called when windows broadcasts things like WM_THEMECHANGED or * WM_DWMCOMPOSITIONCHANGED */ void API::updateState() { BOOL result = FALSE; ::ZeroMemory(&sysState, sizeof(TSysState)); if(sysConfig.uxThemeValid) sysState.isThemed = pfnIsThemeActive() ? true : false; if(sysConfig.isVistaPlus) { sysState.isDwmActive = (pfnDwmIsCompositionEnabled && (pfnDwmIsCompositionEnabled(&result) == S_OK) && result) ? true : false; sysState.isAero = /* (CSkin::m_skinEnabled == false) && */ cfg::getByte("CLUI", "useAero", 1) /* && CSkin::m_fAeroSkinsValid */ && sysState.isDwmActive; } }
/** * update system's state (theme status, aero status, DWM check... * * called when windows broadcasts things like WM_THEMECHANGED or * WM_DWMCOMPOSITIONCHANGED */ void Api::updateState() { BOOL result = FALSE; ::ZeroMemory(&sysState, sizeof(TSysState)); sysState.isThemed = pfnIsThemeActive() ? true : false; if(sysConfig.isVistaPlus) { sysState.isDwmActive = (pfnDwmIsCompositionEnabled && (pfnDwmIsCompositionEnabled(&result) == S_OK) && result) ? true : false; sysState.isAero = cfg::getByte(SKIN_DB_MODULE, "fUseAero", 1) && sysState.isDwmActive; } else sysState.isAero = sysState.isDwmActive = false; }
BOOL CThemeHelperST::IsThemeActive() { if(pfnIsThemeActive != NULL) return pfnIsThemeActive(); return FALSE; }