正文
一、 实现代码
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); } 代码说明:
a). 关键部分为将LoadResource转换成BYTE*以及CreateImageFromBuffer方法。
结束
研究过程中找了许多文章,大多数都是从文件加载。CxImage也试过了, 在CSDN上找到了据说是可以在WM运行的代码,但是关键方法都不能使用,唯一测试加载成功的是从Buffer加载,同上,但是这样一来代价太大,没有lib文件,还需要自己封装,裸的项目文件将近百个,编译都要老长时间。终于松口气,又完成一个任务 :)
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586567,如需转载请自行联系原作者