JPG,动态GIF,BMP一些常用解决办法
常用方式0,使用GIF89A类: 优势: 一招鲜吃遍天,上至动态GIF,下至静态JPG,BMP两句搞定,简单方便 缺点: 有时会出现边缘效果, 有的图像会挺明显 使用方法: #include "gif89a.h" CGif89a* gif; 在调用函数内添加: gif=new CGif89a(this->m_hWnd); gif->Load("test.gif"); gif->SetPosition(100,100); gif->Play(); //gif->Pause(TRUE); //Pause(TRUE)为暂停GIF的播放 //gif->Pause(FALSE);//Pause(FALSE)为继续GIF的播放 常用方式1,使用iPicture: 优势: MS早期的图片类, 可以显示所有的静态图片, 显示动态GIF尚需一个GIF的图象储存结构gifImage,如果有兴趣可以看看薛碧的如何在VC中显示动态的GIF 缺点: 用户自主定义不太方便, 薛碧文章是介绍在RC静态编辑显示动态GIF的办法,本来打算改写一下作个GIF类, 发现了GIF89A, 于是没作了多余工 调用方法: CString sPath; sPath=_T("1.JPG"); //CDC* pDC = GetDlgItem(IDC_CONTROL)->GetDC();//获得控件DC CRect zcRect; GetClientRect(&zcRect); ShowJpgGif(pDC,sPath,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); 函数实现 BOOL ShowJpgGif(CDC* pDC,CString strPath, int x, int y ,int Width, int Height) { IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; //打开文件并检测文件的有效性 if (file.Open(strPath,Cfile&::modeRead)&& file.GetStatus(strPath,fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { pvData = GlobalLock(hGlobal); if (pvData != NULL) { file.Read(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } } else { return false; } //打开文件结束 //显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画, //要显示动画GIF请使用ACTIVE控//件。 IPicture *pPic; //load image from file stream if(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; //get image height and width 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; //use render function display image if(FAILED(pPic->Render(*pDC, x, y, Width, Height,0, hmHeight,hmWidth,-hmHeight,NULL))) { pPic->Release(); return false; } pPic->Release(); } else { return false; } return true; } 常用方式2, 使用MS CImage 优点: MS的最新图像类,MFC/ATL通用, 应该是可靠的,使用也很简单方便,较为灵活,目的应该为替代iPicture类 缺点: 还是不能完美的解决动态GIF问题, #include <atlimage.h> CImage m_Image; //pS: 以下插入调用函数 CString strFilter; CSimpleArray<GUID> aguidFileTypes; HRESULT hResult; //CImage m_Image; // 获取CImage支持的图像文件的过滤字符串 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files")); if (FAILED(hResult)) { MessageBox("GetExporterFilter调用失败!"); return; } CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); if(IDOK != dlg.DoModal()) return; m_Image.Destroy(); // 将外部图像文件装载到CImage对象中 hResult = m_Image.Load(dlg.GetFileName()); if (FAILED(hResult)) { MessageBox("调用图像文件失败!"); return; } // 设置主窗口标题栏内容 CString str; str.LoadString(AFX_IDS_APP_TITLE); AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName()); Invalidate(); // 强制调用OnDraw //PS: 以下插入重画函数 void Ctemp7View::OnDraw(CDC* pDC) { Ctemp7Doc* pDoc = Getdocument.); ASSERT_VALID(pDoc); // TODO: 在此处为本机数据添加绘制代码 if (!m_Image.IsNull()) { CRect zcRect; GetClientRect(&zcRect); m_Image.Draw(pDC->m_hDC,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); } } 本文演示代码打包下载: PIC_test.rar |