VC++實(shí)現(xiàn)View內(nèi)容保存為圖片的方法
本文實(shí)例講述了VC++實(shí)現(xiàn)View內(nèi)容保存為圖片的方法。分享給大家供大家參考,具體如下:
我們?cè)趩挝臋n應(yīng)用程序中,經(jīng)常需要將View中的內(nèi)容保存為各種格式的圖片文件,以便打印。乍一看,可能不知道從哪里下手,其實(shí)主要就是用到Bitmap的save方法,如:
HDC hmemDC = ::CreateCompatibleDC( hdc ); HBITMAP hBmp = ::CreateCompatibleBitmap( hdc, destRect.Width(),destRect.Height() ); HANDLE hOld = ::SelectObject(hmemDC, hBmp); Graphics graphic( hmemDC ); //下面進(jìn)行各種文字、圖形、圖片的繪制 ……………………………………………. Bitmap bitmap(hBmp, NULL ); CLSID clsID; //保存不同格式的(.jpg,bmp,png)的圖片需要不同的CLSID, imageFormat為用戶期望保存的圖片格式 if (_T("jpg") == imageFormat.MakeLower() ) { GetEncoderClsid(_T("image/jpeg"), &clsID); } else if ( _T("bmp") == imageFormat.MakeLower() ) { GetEncoderClsid(_T("image/bmp"), &clsID); } else if ( _T("png") == imageFormat.MakeLower() ) { GetEncoderClsid(_T("image/png"), &clsID); } //保存為圖片,strFN為圖片保存的路徑和文件名 bitmap.Save( strFN, &clsID, NULL ); ::SelectObject( hmemDC, hOld ); ::DeleteObject( hBmp ); ::DeleteDC( hmemDC );
下面重要的就是獲取不同圖片格式的CLSID,看下面代碼:
Int GetEncoderClsid(const TCHAR* format, CLSID* pClsid) { UINT num= 0; UINT size= 0; ImageCodecInfo* pImageCodecInfo= NULL; GetImageEncodersSize(&num, &size); if(size== 0) { return -1; } pImageCodecInfo= (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo== NULL) { return -1; } GetImageEncoders(num, size, pImageCodecInfo); for(UINT j=0; j< num; ++j) { if(_tcscmp(pImageCodecInfo[j].MimeType, format)== 0) { *pClsid= pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } } free(pImageCodecInfo); return -1; }
如果是直接打印View中的圖片,那么View的OnDraw函數(shù)給的pDC指的就是打印機(jī)的紙張的尺寸,我們無需做太多的處理,我們只需要將當(dāng)期View的區(qū)域轉(zhuǎn)換到紙張的大小即可,如:
CRect rc; GetClientRect( &rc ); Long width =0,height = 0; if( pDC->IsPrinting) { int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX); int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY); //得到設(shè)備坐標(biāo)和邏輯坐標(biāo)的比例 long xExt = (long)rc.width() * xLogPixPerInch/96; long yExt = (long)rc.height() * yLogPixPerInch/96; width = xExt; height = yExt; //后面使用GDI+進(jìn)行繪圖 HBITMAP hBmp = ::CreateCompatibleBitmap( pDC->m_hDC, width, height ); HANDLE hOld = ::SelectObject(hmemDC, hBmp); Graphics tmp_graff( hmemDC ); ………………………………….. //獲取紙張的大小,然后拉伸拷貝 int iPageWidth = pDC->GetDeviceCaps(HORZRES); int iPageHeight = pDC->GetDeviceCaps(VERTRES); ::StretchBlt( pDC->m_hDC, 0, 0, iPageWidth, iPageHeight, hmemDC, 0, 0, width, height, SRCCOPY ); ::SelectObject( hmemDC, hOld ); ::DeleteObject( hBmp ); ::DeleteDC( hmemDC ); }
希望本文所述對(duì)大家VC++程序設(shè)計(jì)有所幫助。
相關(guān)文章
詳解C++數(shù)組和數(shù)組名問題(指針、解引用)
這篇文章主要介紹了詳解C++數(shù)組和數(shù)組名問題(指針、解引用),指針的實(shí)質(zhì)就是個(gè)變量,它跟普通變量沒有任何本質(zhì)區(qū)別,指針本身是一個(gè)對(duì)象,同時(shí)指針無需在定義的時(shí)候賦值,具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間
這篇文章主要介紹了詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08基于OpenGL實(shí)現(xiàn)多段Bezier曲線拼接
這篇文章主要為大家詳細(xì)介紹了基于OpenGL實(shí)現(xiàn)多段Bezier曲線拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04QT連接Mysql數(shù)據(jù)庫的實(shí)現(xiàn)步驟
本文主要介紹了QT連接Mysql數(shù)據(jù)庫的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C語言實(shí)現(xiàn)多線程定時(shí)器實(shí)例講解
在本篇文章里小編給各位分享的是一篇關(guān)于C語言實(shí)現(xiàn)多線程定時(shí)器實(shí)例講解內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2021-01-01C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解
C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下2022-08-08c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題
這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動(dòng)態(tài)DP來解決Coin Change的問題示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10