如何显示多种图像格式
?牐牳梅椒ㄊ紫壬饕桓鯥Stream流对象指针*pStrm、图像对象指针*pPicture然后利用一个Cfile对象file将图像文件的数据读进一个数据块,用该数据块生成流对象,方法实现过程中最重要的一点是利用了Active技术提供的图像对象Ipicture,它是Active技术提供的管理图像的一个最主要的接口,OleLoadPicture()用得到的流对象pStrm初始化图像对象pPicture,利用它的成员函数IPicture::get_Width()、IPicture::get_Height()得到图像的宽、高等特性;Ipicture::Render()在视图上把图像显示出来。上述函数的具体使用方法可以查阅微软的在线帮助MSDN。为了演示该方法的实现过程,利用ClassWizard定义一个菜单响应函数OnImageShow(),在该函数内对图像文件进行显示操作:
?牐爒oid CMainFrame::OnImageShow()
?牐爗
?牐燙String filename1;
?牐爏tatic char szFilter[]=“BMP(*.bmp)|*.bmp|JPG(*.jpg)|*.jpg|GIF(*.gif)|*.gif|TIF(*tif)|(*.tif)||”;??
?牐燙FileDialog dlg(TRUE,“gif”,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter);?牔?
?牐爄f(dlg.DoModal()==IDOK)??
?牐爁ilename1=dlg.GetPathName();
?牐營Picture *pPicture; //声明OLE提供的图像对象;
?牐營Stream *pStrm;//声明一个流对象;
?牐燙FileStatus fstatus;
?牐燙File file;
?牐燣ONG cb;
?牐爄f (file.Open(filename1,CFile::modeRead)&file.GetStatus(filename1, fstatus)&((cb = fstatus.m_size)!= -1))?牐?
?牐爗
?牐燞GLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);?牔?
?牐燣PVOID pvData = NULL;
?牐燙DC *pDC;??
?牐爌DC=(this->GetActiveView())->GetDC();//得到活动视图的设备上下文;
?牐爄f(hGlobal != NULL)
?牐爗??
?牐爄f ((pvData = GlobalLock(hGlobal))!= NULL)
?牐爗
?牐爁ile.ReadHuge(pvData,cb);//将图像文件数据读入内存;
?牐燝lobalUnlock(hGlobal);
?牐燙reateStreamOnHGlobal(hGlobal, TRUE, &pStrm); //创建流对象
if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,LPVOID*)&pPicture)))
?牐?//根据流对象pStrm初始化图像对象pPicture;
?牐爗??
?牐燨LE_XSIZE_HIMETRIC Width;
?牐燨LE_YSIZE_HIMETRIC Height;??
?牐爌Pic->get_Width(&Width);?牔?
?牐爌Pic->get_Height(&Height);
?牐?//得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素。
?牐爄f (FAILED (pPicture->Render(*pDC,100,50,300,200,0,Height,Width,- Height,NULL)))?牐牐?
?牐?//在初始点(100,50)宽为200、高为150的矩形中显示图像;
?牐燗fxMessageBox(“Failed To Render The picture!”);?牔?
?牐爌Pic->Release();
?牐爙
?牐爀lse
?牐燗fxMessageBox(“Error Loading Picture From Stream!”);
?牐爙??
?牐爙??
?牐爙??
?牐爀lse
?牐燗fxMessageBox(“Cant Open Image File!”);?牔?
?牐爙
?牐犜谏衔闹校颐墙岷弦桓黾虻サ睦咏步饬司咛逑允靖髦指袷酵枷裎募姆椒ǎ绦蛟赪indows 2000、Visual C++6.0编译环境下通过。经实验后发现可以成功的显示BMP、JEPG、GIF格式的文件,其他的如TIFF、PNG、WMF、PCX等格式文件大家可以自行摸索。