将内存中的图片数据显示到Picture图片控件上

来源:互联网 发布:多管升级数据 编辑:程序博客网 时间:2024/05/18 23:16

pContentBuffer指向一块内存数据(图片);dataLen为内存中图片数据的大小。函数功能是将内存中的图片数据加载到Picture控件上显示出来。

CImage img;BOOL bRet = LoadMemImage(pContentBuffer, dataLen, img);CStatic *pStaticPic = (CStatic *)GetDlgItem(IDC_PIC);if (bRet && pStaticPic){HBITMAP retBitmap = pStaticPic->SetBitmap(img.Detach());}

主要函数LoadMemImage(pContentBuffer, dataLen, img)的实现过程如下:其功能是将内存中的图片数据加载到CImage对象中。

BOOL LoadMemImage(void *pMemData, ULONG nLen, CImage& imgObj){BOOL bRet = FALSE;/*GlobalAlloc申请的内存分两种,一种是GMEM_FIXED(固定内存块),另一种是GMEM_MOVEABLE(可移动的内存块)。两者的差别只在于,对于GMEM_MOVEABLE类型的内存块,操作系统是可以移动的,比如堆中有好几块小内存,当再申请一大块内存时,操作系统会移动GMEM_MOVEABLE类型的内存来合并出一大块。*/HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nLen);void *pData = GlobalLock(hGlobal);//将内存块的句柄转换为一个指针memcpy(pData, pMemData, nLen);GlobalUnlock(hGlobal);//解锁先前被锁定的内存IStream *pStream = NULL;/*CreateStreamOnHGlobal():函数从指定内存创建流对象。第二个参数指明上一个参数指定的内存在该对象被释放后是否也自动释放。如果该参数设定为FALSE,那么调用者必须显式的释放hGlobal。如果该参数设置为TRUE,则hGlobal最终会自动释放。*/if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK) {if (SUCCEEDED(imgObj.Load(pStream))) bRet = TRUE;pStream->Release();}GlobalFree(hGlobal);//释放内存块return bRet;} 

CImage类的Load()函数有两种加载方式:

HRESULT Load(   LPCTSTR pszFileName ) throw( );HRESULT Load(   IStream* pStream) throw();


此处为第二种:通过流指针形式来加载。

第一种方式:通过文件名来加载,在之前的博客中实现过,连接地址如下:通过文件名来加载

0 0