ShowPic(CString lpstrFile,int show_Width,int show_Height) { IPicture *pPic; IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; double fX,fY; //获取屏幕的长和宽 fX = (double)pDC->GetDeviceCaps(HORZRES); fY = (double)pDC->GetDeviceCaps(VERTRES); if (file1.Open(lpstrFile,CFile::modeRead)&&file.GetStatus(lpstrFile, 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); //装入图形文件 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); //将图形输出到屏幕上(有点像BitBlt) if(FAILED(pPic->Render(*pDC,0,0,show_Width,show_Height,0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("Failed To Render The picture!"); pPic->Release(); } else AfxMessageBox("Error Loading Picture From Stream!"); } } } }
// MSDN: STDAPI OleLoadPicture( IStream * pStream,//Pointer to the stream that contains picture's data LONG lSize, //Number of bytes read from the stream BOOL fRunmode, //The opposite of the initial value of the picture's property REFIID riid, //Reference to the identifier of the interface describing the type of interface pointer to return VOID ppvObj //Address of output variable that receives interface pointer requested in riid );