我使用的是那种经典的方法,可以顺利的显示出图片,但是不能刷新窗口,
如最小化再恢复图片就不见了。请问各位这个问题如何解决?
代码附下:    CDC* pDC = GetDC();
IStream *pStm;  
CFileStatus fstatus;  
CFile file;  
LONG cb;  
if(file.Open(strFileName,CFile::modeRead) && file.GetStatus(m_sPath,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); 

}
file.Close();
} IPicture *pPic;
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;  

double x = (double)pDC->GetDeviceCaps(HORZRES);
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->GetSafeHdc(),0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) 
AfxMessageBox("渲染图像失败!");  
pPic->Release();  
}  
else  
AfxMessageBox("从流中装载图像失败!");  
pStm->Release();

解决方案 »

  1.   

    不会吧。放到OnPaint里面每次刷新都需要重新loadfile,不是太浪费系统资源了。
      

  2.   

    if(FAILED(pPic->Render(pDC->GetSafeHdc(),0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) 
    AfxMessageBox("渲染图像失败!");  
    pPic->Release(); /////这一句不要,设置为成员变量,在需要释放时再释放
    至少我的是没有这时释放的,是在下一次响应和退出时释放的