2021年4月

代码:

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();
}