typedef BOOL (*load_function)(void* param, IStream*lpStream);
BOOL LoadFromIStream(IStream* lpStream, load_function func, void*param)
{return (*func)(param, lpStream);
}
BOOL LoadFromBuffer(const BYTE* lpBuf, DWORD dwSize, load_function func, void*param)
{if (NULL == lpBuf || dwSize <= 0)returnFALSE;
HGLOBAL hGlobal=::GlobalAlloc(GHND, dwSize);if (NULL ==hGlobal)returnFALSE;
LPVOID lpBuffer=::GlobalLock(hGlobal);if (NULL ==lpBuffer)
{
::GlobalFree(hGlobal);returnFALSE;
}
memcpy(lpBuffer, lpBuf, dwSize);
::GlobalUnlock(hGlobal);
LPSTREAM lpStream=NULL;
HRESULT hr= ::CreateStreamOnHGlobal(hGlobal, TRUE, &lpStream);if (hr !=S_OK)
{
::GlobalFree(hGlobal);returnFALSE;
}
BOOL bRet=LoadFromIStream(lpStream, func, param);
lpStream->Release();returnbRet;
}
BOOL LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName, LPCTSTR pszResType, load_function func,void*param)
{
HRSRC hRsrc=::FindResource(hInstance, pszResourceName, pszResType);if (NULL ==hRsrc)returnFALSE;
DWORD dwSize=::SizeofResource(hInstance, hRsrc);if (0 ==dwSize)returnFALSE;
HGLOBAL hGlobal=::LoadResource(hInstance, hRsrc);if (NULL ==hGlobal)returnFALSE;
LPVOID pBuffer=::LockResource(hGlobal);if (NULL ==pBuffer)
{
::FreeResource(hGlobal);returnFALSE;
}
HGLOBAL hGlobal2=::GlobalAlloc(GHND, dwSize);if (NULL ==hGlobal2)
{
::FreeResource(hGlobal);returnFALSE;
}
LPVOID pBuffer2=::GlobalLock(hGlobal2);if (NULL ==pBuffer2)
{
::GlobalFree(hGlobal2);
::FreeResource(hGlobal);returnFALSE;
}
memcpy(pBuffer2, pBuffer, dwSize);
::GlobalUnlock(hGlobal2);
LPSTREAM pStream=NULL;
HRESULT hr= ::CreateStreamOnHGlobal(hGlobal2, TRUE, &pStream);if (hr !=S_OK)
{
::GlobalFree(hGlobal2);
::FreeResource(hGlobal);returnFALSE;
}
BOOL bRet=LoadFromIStream(pStream, func, param);if(pStream)
pStream->Release();
::FreeResource(hGlobal);returnbRet;
}
BOOL LoadFromResource(HINSTANCE hInstance, UINT nIDResource, LPCTSTR pszResType, load_function func,void*param)
{returnLoadFromResource(hInstance, MAKEINTRESOURCE(nIDResource), pszResType, func, param);
}
typedef BOOL (*load_function)(void* param, IStream*lpStream);
BOOL LoadFromResource(HINSTANCE hInstance, UINT nIDResource, LPCTSTR pszResType, load_function func,void*param);class CImageStatic : public CWindowImpl<CImageStatic, CStatic>,public COwnerDraw<CImageStatic>{private:static BOOL __LoadFunc(void* param, IStream*lpStream)
{return ((CImageStatic*)param)->_LoadFunc(lpStream);
}
BOOL _LoadFunc(IStream*lpStream)
{
HRESULT hr= x_pImage->Load(lpStream);if (hr ==S_OK)
{returnTRUE;
}else{returnFALSE;
}
}protected:
CImage*x_pImage;
void SetResId(unsigned intres_id)
{if (!x_pImage)deletex_pImage;
x_pImage= newCImage();
LoadFromResource(::GetModuleHandle(NULL), res_id, MAKEINTRESOURCE(IDR_GIF),&__LoadFunc, this);this->Invalidate();
}