您的位置: 旅游网 > 明星 >> 刘欢

下显示图象的方法覆盖

发布时间:2021-10-28 05:27:11

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控件的支持。

查看本文来源

合肥癫痫病医院排行榜
艾拉莫德片哪里有卖的
贵阳不孕不育医院
猜你会喜欢的
猜你会喜欢的