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

解决方案 »

  1.   

    在每次显示图片前,先把背景重新填充成白色的。
    ::FillRect(pDC->GetSafeHdc(),&rect,CBrush(RGB(255,255,255)));
      

  2.   

    试了下 没出现你说的问题
    倒是改变图片时不显示新的图片,改变图片之后调用View类里的Invalidate()函数就好了。
    我是这么做的在OnDraw函数调用
    ShowJpg(pDC,m_strJPGPath,0,0);
    改变m_strJPGPath的值改变显示的图片
      

  3.   

    在WM_ERASEBKGND
    里面直接返回true;
    就不回闪了
      

  4.   


    这个我也尝试过,图像是不闪了,但是显示图片的背景就会有莫名其妙的错误
    以前用双缓冲做过bmp的。。但是对于jpg图片,有点不知道从那个函数着手使用双缓冲。。
    继续关注。。同样感谢。。
      

  5.   

    单文档还是多文档?另外.这个一样可以双缓冲的,关键是传入的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)来显示(假如需要显示)
      

  6.   

    Renader():第二个至第九个参数都表示啥啊?