您的位置:首页 > 数据库

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

2011-07-28 16:45 351 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐