ADO 从ACCESS数据库读取图片并显示出来

来源:互联网 发布:移动不给开4g网络 编辑:程序博客网 时间:2024/05/28 04:56


try
{   
//获得文件的大小
long nSize = theApp.m_pRecordset->GetFields()->GetItem("Data")->ActualSize;
if(nSize <= 0)
{
return;
}
_variant_t varBLOB;


varBLOB = theApp.m_pRecordset->GetFields()->GetItem("Data")->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [nSize+1])   ///重新申请必要的存储空间

char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pBuffer,pBuf,nSize);     ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);

CDC*   pDC; 
IPicture   *pPic;   
IStream   *pStm;   
HGLOBAL   hGlobal = GlobalAlloc(GMEM_MOVEABLE,nSize);   
LPVOID   pvData = NULL;   
if(hGlobal != NULL)   
{   
if((pvData = GlobalLock(hGlobal)) != NULL)   
{   
memcpy(pvData,pBuf,nSize); 
GlobalUnlock(hGlobal);   
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);   

if(SUCCEEDED(OleLoadPicture(pStm,nSize,TRUE,IID_IPicture,(LPVOID*)&pPic)))   
{   
OLE_XSIZE_HIMETRIC   hmWidth;   
OLE_YSIZE_HIMETRIC   hmHeight;   

pPic-> get_Width(&hmWidth);   
pPic-> get_Height(&hmHeight);  
CRect rect;

//获取控件相对于屏幕的位置
GetDlgItem(IDC_SHOW)->GetWindowRect(&rect);

//转化为相对于控件的位置
ScreenToClient(rect);     

double   fX,fY;   
fX   =rect.Width(); 
fY   =rect.Height(); 


pDC=GetDC(); 
                           
if(FAILED(pPic-> Render(*pDC,rect.TopLeft().x,rect.TopLeft().y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))   
AfxMessageBox( "图片显示失败! ");   
pPic-> Release();   
}   
else   
AfxMessageBox( "加载图片失败! ");   
}   
}
delete [] pBuffer;
pBuf=0;
}
}

}
catch (_com_error e) {
       // ::MessageBox(NULL,(LPCTSTR)e.Description(),"",MB_OK);
}
原创粉丝点击