VC下显示JPG,GIF图像显示就开发过程中要用到个模块今天我们就来谈谈它具体实现思路方法,中国自学编程网整理发布www.zxbc.cn
在显示图像的前首先要获取到图像文件存放路径这里采用标准文件打开对话框来选取图像文件文件名存放在CString型变量m_sPath中:
CFileDialog dlg(TRUE,\"jpg\",\"*.jpg\",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
\"JPEG文件(*.jpg)|*.jpg|GIF文件(*.g)|*.g||\",NULL);
(dlg.DoModalIDOK)
{
m_sPath=dlg.GetPathName;
Invalidate;
}
为简单计图形显示代码直接在视类中OnDraw中编写首先打开文件并判断文件可用性并把文件内容放到流接口IStream对象pStm中:
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
……
(file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
(hGlobal != NULL)
{
((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
然后就直接OleLoadPicture从流中装载图像:
IPicture *pPic;
……
OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));
由于该有时会导致失败所以应当用SUCCEEDED宏来做些适当保护工作,只有在数据装载成功前提下才能继续下面图像显示工作:
(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
……
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox(\"渲染图像失败!\");
pPic->Release;
}
AfxMessageBox(\"从流中装载图像失败!\");
其中显示工作主要是由IPicture接口对象Render来完成该主要用来将图片指定部分画到指定设备环境指定位置原型如下:
HRESULT Render( HDC hdc, //渲染图像用设备环境句柄 [Page]
long x, //在hdc上水平坐标
long y, //在hdc上垂直坐标
long cx, //图像宽度
long cy, //图像高度
OLE_XPOS_HIMETRIC xSrc, //在源图像上水平偏移
OLE_YPOS_HIMETRIC ySrc, //在源图像上垂直偏移
OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝数量
OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝数量
LPCRECT prcWBounds //指向目标图元设备环境句柄指针);
小结:到此为止通过上述代码已经能够在客户区内显示JPEG、GIF等标准图像了但对于有多帧图片(即有动画)GIF格式图像目前还只能显示第帧如要完整显示GIF 动画全过程还需要外部Active XControl控件支持
最新评论