生活随笔
收集整理的這篇文章主要介紹了
VC6中使用内存DC加载并显示JPG图片的注意事项
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
From: http://blog.csdn.net/boythl/article/details/3137446
今天在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圖片的第一禎圖片,我未用到。
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;??????}????????????????IPicture?*pPic;????????????????if(SUCCEEDED(OleLoadPicture(pStm,?fstatus.m_size,?TRUE,IID_IPicture,?(LPVOID*)&pPic)))???????{????????????if?(OriginalSize)?????????{????????????long?nWidth?=?0,?nHeight?=?0;?????????????pPic->get_Width(?&nWidth?);?????????????pPic->get_Height(?&nHeight?);?????????????????????????CSize?sz(?nWidth,?nHeight?);?????????????pDC->HIMETRICtoDP(?&sz?);?????????????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);???????????????????????????????????????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);??????????????????????????????????????????????????if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))?????????????????????{????????????????pPic->Release();??????????????????return?false;????????????????????}????????}???????????????????????if?(?pStm?)?pStm->Release();?????????if?(?pPic?)?pPic->Release();?????}???????else????????{??????????????return?false;???????}????????????return?true;}
?? 感謝vane小弟的幫助!及一個blog:
http://topameng.spaces.live.com/blog/cns!f962d4854a8233d!248.entry ===================================
非注明轉載的文章和blog在未特殊聲明情況下一般為本人原創或整理,
原創文章版權歸沙漠孤狐(lonefox)所有;轉載文章版權歸原作者所有;
http://blog.csdn.net/boythl
歡迎轉載,但請注明出處,保留作者和版權信息。
===================================
總結
以上是生活随笔為你收集整理的VC6中使用内存DC加载并显示JPG图片的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。