辅导:C技巧(使用内存DC加载并显示JPG图片)
来源:优易学  2011-10-31 12:59:55   【优易学:中国教育考试门户网】   资料下载   IT书店
  在VC6中显示JPG图片,采用了内存DC缓存的方法刷新,但死活刷不出来,查了一下午才明白(没办法,很少用GDI,使用IPicture::Render函数向DC上贴图时,若DC是一个内存DC,一定要先SelectObject一个CBitmap,内存DC没有Bitmap是画不出来的!
  另外,IPicture是COM库,需要注意初始化COM,
  CMYApp::InitInstance() 里使用 CoInitialize(NULL);
  CMYApp::ExitInstance() 里使用 CoUninitialize();
  下面贴出显示JPG图片到DC的函数,来自网上,青年人网站整理了下,还可显示GIF图片的第一祯图片,这里未用到。
  /*************************************************
  Function : ShowJPG
  Description : 在DC上按图片原始尺寸显示JPG图片
  Calls :
  Called By :
  Parameter : [CDC* pDC] --- DC
  : [CString strPath] --- 要显示的图片路径,建议全路径
  : [int x] --- DC上显示的X位置
  : [int y] --- DC上显示的Y位置
  : [bool OriginalSize] --- 是否按图片原始尺寸显示,false时将按DC大小缩放
  Return : bool --- 是否成功
  Author : Unknown
  Date : 2008-10-24
  Modify :
  *************************************************/
  bool ShowJPG(CDC* pDC,CString strPath, int x, int y, bool OriginalSize)
  {
  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.ReadHuge(pvData, cb);
  GlobalUnlock(hGlobal);
  CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
  }
  }
  }
  else
  {
  return false;
  }
  //打开文件结束
  //显示JPEG图片
  IPicture *pPic;
  //load image from file stream
  if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE,IID_IPicture, (LPVOID*)&pPic)))
  {
  if (OriginalSize) //图片原始大小显示
  {
  long nWidth = 0, nHeight = 0; // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
  pPic->get_Width( &nWidth ); // 宽
  pPic->get_Height( &nHeight ); // 高
  CSize sz( nWidth, nHeight );
  pDC->HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
  pPic->Render(pDC->m_hDC, 0, 0, sz.cx, sz.cy,
  0, nHeight, nWidth, -nHeight, NULL);
  }
  else
  {
  OLE_XSIZE_HIMETRIC hmWidth;
  OLE_YSIZE_HIMETRIC hmHeight;
  pPic->get_Width(&hmWidth);
  pPic->get_Height(&hmHeight);
  //get image height and width
  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);
  //use render function display image
  //按图片原始大小显示
  if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
  {
  pPic->Release();
  return false;
  }
  }
  if ( pStm ) pStm->Release(); // 释放 IStream 指针
  if ( pPic ) pPic->Release(); // 释放 IPicture 指针
  }
  else
  {
  return false;
  }
  return true;
  }

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训