下显示图象的方法覆盖
VC下显示JPG,GIF的图像的显示就程序开发过程中要用到的一个模块,今天我们就来谈一谈它的具体的实现方法。 在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString型的变量m_sPath中:
以下是引用片段:
CFileDialogdlg(TRUE,\"jpg\",\"*.jpg\",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
\"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||\",NULL);
if(Modal()==IDOK)
{
m_sPath=tPathName();
Invalidate();
}
为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:
以下是引用片段:
IStream*pStm;
CFileStatusfstatus;
CFilefile;
LONGcb;
……
if(en(m_Path,CFile::modeRead)tStatus(m_Path,fstatus)((cb=fstatus.m_size)!=-1))
{
HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOIDpvData=NULL;
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
adHuge(pvData,cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,pStm);
}
}
}
然后,就直接调用OleLoadPicture函数从流中装载图像:
以下是引用片段:
IPicture*pPic;
……
OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)pPic));
由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:
以下是引用片段:
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)pPic)))
{
OLE_XSIZE_HIMETRIChmWidth;
OLE_YSIZE_HIMETRIChmHeight;
pPic-get_Width(hmWidth);
pPic-get_Height(hmHeight);
doublefX,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);
if(FAILED(pPic-Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox(\"渲染图像失败!\");
pPic-Release();
}
else
AfxMessageBox(\"从流中装载图像失败!\");
其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。原型如下:
以下是引用片段:
HRESULTRender(HDChdc,//渲染图像用的设备环境句柄
longx,//在hdc上的水平坐标
longy,//在hdc上的垂直坐标
longcx,//图像宽度
longcy,//图像高度
OLE_XPOS_HIMETRICxSrc,//在源图像上的水平偏移
OLE_YPOS_HIMETRICySrc,//在源图像上的垂直偏移
其中有31%的人对他极其不满。近一半受访者认为在萨科齐所涉司法问题的调查当中 OLE_XSIZE_HIMETRICcxSrc,//在源图像上水平拷贝的数量
OLE_YSIZE_HIMETRICcySrc,//在源图像上垂直拷贝的数量
LPCRECTprcWBounds//指向目标图元设备环境句柄的指针);
小结:到此为止,通过上述代码已经能够在程序的客户区内显示JPEG、GIF等标准的图像了,但对于有多帧图片(即有动画)的GIF格式的图像,目前还只能显示第一帧,如要完整的显示GIF 动画的全过程,还需要外部ActiveX控件的支持。
查看本文来源
合肥癫痫病医院排行榜艾拉莫德片哪里有卖的
贵阳不孕不育医院
- vivo Y72t上架,天玑700+6000毫安大蓄电池
- “慈善奶奶”经中山医院救治康复出院,她曾卖房为芦山受灾孩子建小学
- 网红吃播套路较浅,都是障眼法,学会这6招,你也可以是大胃王
- 碧桂园成功面世5亿元公司债 票面利率4.5%
- 「亦同图书馆·世界像素展」空降青岛,人类文明简史一天看尽!
- 近6400名学生云肄业,上海海事大学校长寄语肄业生:闯出自己的一片天地!
- 邦邦科普|脊髓损伤后的多种不同阶段,辅具该如何选择?
- 幽默笑话:丑成这样的一张暗讽,真是白瞎了这么好的身材
- 守好这三关,让心肌梗塞 “没门儿” !
- 钱江摩托:拟向实控人李书福集团公司定增募资不超5.05亿元
- 广州普通高中比高考还难?40%学生上不了高中!
- CBA最有可能拿下周琦的球队?辽宁队直接被排除,上海队与广东队渴望最大