1.使用CImage的Load方法载入IStream然后使用其方法Draw绘制到指定设备上下文。
BOOL CBmpButton::LoadFromResource(UINT nResId,LPCTSTR lpResFolder,CImage& image)
{
image.Destroy();
HRSRC hRsrc = FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(nResId),lpResFolder);
if (NULL == hRsrc)
{
return FALSE;
}
HGLOBAL hSrcglob = LoadResource(AfxGetResourceHandle(),hRsrc);
if (NULL == hRsrc)
{
return FALSE;
}
DWORD dwRsrcSize = SizeofResource(AfxGetResourceHandle(),hRsrc);
LPVOID pRsrcData = LockResource(hSrcglob);
if (NULL == pRsrcData || dwRsrcSize <= 0)
{
FreeResource(hSrcglob);
hSrcglob = NULL;
return FALSE;
}
HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE,dwRsrcSize);
if (NULL == hData)
{
FreeResource(hSrcglob);
return FALSE;
}
LPVOID pData = GlobalLock(hData);
memcpy(pData,pRsrcData,dwRsrcSize);
GlobalUnlock(hData);
UnlockResource(hSrcglob);
FreeResource(hSrcglob);
hSrcglob = NULL;
IStream* pStream = NULL;
HRESULT hRet = CreateStreamOnHGlobal(hData,FALSE,&pStream);
if (FAILED(hRet))
{
FreeResource(hSrcglob);
hSrcglob = NULL;
GlobalFree(hData);
hData = NULL;
return FALSE;
}
if(FAILED(image.Load(pStream)))
{
FreeResource(hSrcglob);
hSrcglob = NULL;
GlobalFree(hData);
hData = NULL;
return FALSE;
}
for(int i = 0; i < image.GetWidth(); i++)
{
for(int j = 0; j < image.GetHeight(); j++)
{
unsigned char* pucColor = reinterpret_cast<unsigned char *>(image.GetPixelAddress(i , j));
pucColor[0] = pucColor[0] * pucColor[3] / 255;
pucColor[1] = pucColor[1] * pucColor[3] / 255;
pucColor[2] = pucColor[2] * pucColor[3] / 255;
}
}
GlobalFree(hData);
hData = NULL;
return TRUE;
}
2.使用LoadPictrueFromStream绘制API去绘制,要注意图片是倒置的,此处用IPictrue接口(从IStream接口创建出来),此处补贴代码。
注意:
VC加载 png 没有透明功能,要想使加载到程序中的png图像有透明工能,请在加载图片后,加入以下代码,自己处理透明颜色: