首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

[]用mfc显示jpg图片的有关问题

2012-03-30 
[求助]用mfc显示jpg图片的问题主要通过在ondraw中调用ShowJpg这个函数。。函数代码如下:BOOL CBmpjpgView::S

[求助]用mfc显示jpg图片的问题
主要通过在ondraw中调用ShowJpg这个函数。。函数代码如下:
BOOL CBmpjpgView::ShowJpg(CDC* pDC, CString strPath, int x, int y)
{
  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;
  } 
   

  IPicture *pPic; 

  if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,
TRUE,IID_IPicture,(LPVOID*)&pPic))) 
  { 

  OLE_XSIZE_HIMETRIC jpgWidth;  
  OLE_YSIZE_HIMETRIC jpgHeight;  
  pPic->get_Width(&jpgWidth);  
  pPic->get_Height(&jpgHeight);  
  double fX,fY;  
  fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)jpgWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);  
  fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)jpgHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); 
CRect rect;
  GetClientRect(&rect);
if (fX<rect.Width() && fY<rect.Height())
{
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
else 
{
pPic->Render(*pDC,x,y,rect.Width(),rect.Height(),0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
 
}  
  return true;

}

现在的问题是我打开一张大的jpg图片没什么问题..关键我再打开一个小图片的话..会重叠在大图片上面..而且单独打开小图片时..空余的客户端背景也有点小问题..问题应该出现在背景擦除那里..但不知道该怎么操作了..
期待热心的朋友帮助解答下..非常感谢..

[解决办法]
在每次显示图片前,先把背景重新填充成白色的。
::FillRect(pDC->GetSafeHdc(),&rect,CBrush(RGB(255,255,255)));
[解决办法]
试了下 没出现你说的问题
倒是改变图片时不显示新的图片,改变图片之后调用View类里的Invalidate()函数就好了。
我是这么做的在OnDraw函数调用
ShowJpg(pDC,m_strJPGPath,0,0);
改变m_strJPGPath的值改变显示的图片
[解决办法]
单文档还是多文档?

另外.这个一样可以双缓冲的,关键是传入的DC.
Render方法需要传入个DC,然后在上面render:
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,jpgHeight,jpgWidth,-jpgHeight,NULL); 
它可不管你传入的是屏幕DC还是内存DC的,因此,

你只要CreateCompatibleDC()然后SelectObject()一个和这个jpeg一样大的Compatible Bitmap,就可以替换这个
*pDC来调用pPic->Render()方法实现双缓冲(Render()到内存DC)..
最后当然就pDC->BitBlt(left,top,w,h,&memDC,0,0,SRCCOPY)来显示(假如需要显示)

热点排行