正文
一、 实现代码
void
DrawImage(HDC hdc,RECT
&
rc,UINT nIDResource,CString lpType)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nIDResource), lpType);
if ( ! hRsrc)
return ;
// 资源大小
DWORD len = SizeofResource(hInst, hRsrc);
// 转换图片资源为字节数组
BYTE * lpRsrc = (BYTE * )LoadResource(hInst, hRsrc);
if ( ! lpRsrc)
return ;
IImagingFactory * pImgFactory = NULL;
IImage * pImage = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
( void ** ) & pImgFactory)))
{
if (SUCCEEDED(pImgFactory -> CreateImageFromBuffer(lpRsrc,len,BufferDisposalFlagNone, & pImage)))
{
pImage -> Draw(hdc, & rc, NULL);
pImage -> Release();
}
pImgFactory -> Release();
}
CoUninitialize();
// 释放资源
FreeResource(hRsrc);
}
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nIDResource), lpType);
if ( ! hRsrc)
return ;
// 资源大小
DWORD len = SizeofResource(hInst, hRsrc);
// 转换图片资源为字节数组
BYTE * lpRsrc = (BYTE * )LoadResource(hInst, hRsrc);
if ( ! lpRsrc)
return ;
IImagingFactory * pImgFactory = NULL;
IImage * pImage = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
( void ** ) & pImgFactory)))
{
if (SUCCEEDED(pImgFactory -> CreateImageFromBuffer(lpRsrc,len,BufferDisposalFlagNone, & pImage)))
{
pImage -> Draw(hdc, & rc, NULL);
pImage -> Release();
}
pImgFactory -> Release();
}
CoUninitialize();
// 释放资源
FreeResource(hRsrc);
}
代码说明:
a). 关键部分为将LoadResource转换成BYTE*以及CreateImageFromBuffer方法。
结束
研究过程中找了许多文章,大多数都是从文件加载。CxImage也试过了, 在CSDN上找到了据说是可以在WM运行的代码,但是关键方法都不能使用,唯一测试加载成功的是从Buffer加载,同上,但是这样一来代价太大,没有lib文件,还需要自己封装,裸的项目文件将近百个,编译都要老长时间。终于松口气,又完成一个任务 :)
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586567,如需转载请自行联系原作者