C++中显示.jpg图的方法

IStream   *pStm;      
  CFileStatus   fstatus;      
  CFile   file;      
  LONG   cb;      
  ……    
  if   (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;      
  if   (hGlobal   !=   NULL)      
  {      
  if   ((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宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:    
  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;      
  ……    
  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函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。原型如下:    
  HRESULT   Render(   HDC   hdc,   //渲染图像用的设备环境句柄    
  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   //指向目标图元设备环境句柄的指针);    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值