資源描述:
《mfc編程實現(xiàn)顯示jpggif圖像》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、如果你是一個使用VB編程的程序員,要在程序中顯示JPG或者GIF圖像簡直易如反掌,將圖像控件拖到Form中,分分鐘即可搞掂。但是C++程序員要顯示同樣的圖形卻沒有那么輕松,那么是不是要自己編寫JPG解壓縮代碼呢?當然不用那么復(fù)雜啦!本文將針對這個問題討論如何在MFC中顯示JPG或者GIF圖像。???用VB寫圖像顯示程序之所以如此輕松,完全是利用了琳瑯滿目的圖像處理控件,把你想要做的事情都一一搞掂。而C++程序員為了實現(xiàn)相同的功能必須忙乎半天。其實,C/C++程序員也能使用那些VB程序員所用的(或者說幾乎一樣的)圖像控件。VB用的圖像控件實際上都基于一個系統(tǒng)級CO
2、M類——IPicture。下面是有關(guān)IPicture的方法描述:方法描述get_Handle?返回圖像對象的WindowsGDI句柄?get_Hpal?返回圖像對象當前使用的調(diào)色板拷貝get_Type返回當前圖像對象的的圖像類型get_Width?返回當前圖像對象的圖像寬度get_Height?返回當前圖像對象的圖像高度Render?在指定的位置、指定的設(shè)備上下文上繪制指定的圖像部分set_Hpal?設(shè)置當前圖像的調(diào)色板get_CurDC?返回當前選中這個圖像的設(shè)備上下文SelectPicture?將一個位圖圖像選入給定的設(shè)備上下文,返回選中圖像的設(shè)備上下文和圖
3、像的GDI句柄get_KeepOriginalForma?返回圖像對象KeepOriginalFormat屬性的當前值put_KeepOriginalFormat?設(shè)置圖像對象的KeepOriginalFormat屬性PictureChanged?通知圖像對象它的圖像資源改變了SaveAsFile?將圖像數(shù)據(jù)存儲到流中,格式與存成文件格式相同get_Attributes?返回圖像位屬性當前的設(shè)置???從上面這個表可以看出,IPicture操縱著圖像對象及其屬性。圖像對象提供對位圖的抽象,而Windows負責BMP、JPG和GIF位圖的標準實現(xiàn)。程序員要做的只是實
4、例化IPicture,然后調(diào)用其Render函數(shù)。與通常使用接口的方式不同,這里實例的創(chuàng)建我們不用CoCreateInstance函數(shù),而是用一個專門的函數(shù)OleLoadPicture。IStream*pstm=//需要一個流(stream)IPicture*pIPicture;hr=OleLoadPicture(pstm,0,FALSE,IID_IPicture,(void**)&pIPicture);OleLoadPicture從流中加載圖像并創(chuàng)建一個可用來顯示圖像的新IPicture對象。rc=//顯示圖像的矩形//將rc轉(zhuǎn)換為HIMETRICspIPic
5、ture->Render(pDC,rc);???IPicture負責處理所有瑣事,以便確定圖形之格式,如Windows位圖、JPEG或者GIF文件——甚至是圖標和元文件(metafiles)。當然啦,所有這些的實現(xiàn)細節(jié)是需要技巧的,為此我寫了一個Demo程序Myimgapp(如圖二)來示范這些IPicture的使用方法。圖一Myimgapp的運行畫面???Myimgapp是個典型的MFC文檔/視圖程序,在編寫這個程序之前,我首先對IPictureCOM接口進行封裝,之所以要這么做,主要是考慮到并不是每一個程序員都能熟練運用COM接口進行編程,另外將IPictur
6、e的主要功能封裝在C++類中可以使我們的問題更容易解決,我封裝的這個C++類名字叫做CPicture。它的定義和實現(xiàn)細節(jié)請參考本文提供的源代碼。???我在這個類中將復(fù)雜而陌生的COM風格的參數(shù)映射成MFC程序員更為熟悉的類型。例如,CPicture可以讓你直接從文件名加載一幅圖像,CFile或者CArchive,而不用去處理流,CPicture::Render替你完成了IPicture中所有令人討厭的但又是必須的HIMETRIC平滑轉(zhuǎn)換工作。CPicture甚至具備了一個Load函數(shù),它可以從資源數(shù)據(jù)中加載圖像,所以你只要用下面的代碼就可以顯示資源中的圖像:CP
7、icturepic(ID_MYPIC);//加載圖像CRectrc(0,0,0,0);//使用缺省的rcpic.Render(pDC,rc);//顯示圖像CPicture::Render提供一個顯示圖片的矩形。IPicture對圖像進行延伸處理。如果傳遞一個空矩形,則CPicture用圖像本身的大小--不進行延伸處理。對于圖像本身而言,CPicture查找"IMAGE"類型的資源,所以在資源文件中你必須要加入下面的代碼:IDR_MYPICIMAGEMOVEABLEPURE"res\MyPic.jpg"???CPicture是個很棒的傻瓜類,它具備一個ATL智能
8、指針CComQIPtr指