今天在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;
- }
非注明转载的文章和blog在未特殊声明情况下一般为本人原创或整理,
原创文章版权归沙漠孤狐(lonefox)所有;转载文章版权归原作者所有;
http://blog.youkuaiyun.com/boythl
欢迎转载,但请注明出处,保留作者和版权信息。
===================================