国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
在MFC程序中顯示JPG/GIF圖像

如果你是一個使用VB編程的程序員,要在程序中顯示JPG或者GIF圖像簡直易如反掌,將圖像控件拖到Form中,分分鐘即可搞掂。但是C++程序員要顯示同樣的圖形卻沒有那么輕松,那么是不是要自己編寫JPG解壓縮代碼呢?當然不用那么復雜啦!本文將針對這個問題討論如何在MFC中顯示JPG或者GIF圖像。
    用VB寫圖像顯示程序之所以如此輕松,完全是利用了琳瑯滿目的圖像處理控件,把你想要做的事情都一一搞掂。而C++程序員為了實現(xiàn)相同的功能必須忙乎半天。其實,C/C++程序員也能使用那些VB程序員所用的(或者說幾乎一樣的)圖像控件。VB用的圖像控件實際上都基于一個系統(tǒng)級COM類——IPicture。下面是有關 IPicture 的方法描述:

方法描述
get_Handle 返回圖像對象的Windows GDI句柄 
get_Hpal 返回圖像對象當前使用的調(diào)色板拷貝
get_Type返回當前圖像對象的的圖像類型
get_Width 返回當前圖像對象的圖像寬度
get_Height 返回當前圖像對象的圖像高度
Render 在指定的位置、指定的設備上下文上繪制指定的圖像部分
set_Hpal 設置當前圖像的調(diào)色板
get_CurDC 返回當前選中這個圖像的設備上下文
SelectPicture 將一個位圖圖像選入給定的設備上下文,返回選中圖像的設備上下文和圖像的GDI句柄
get_KeepOriginalForma 返回圖像對象KeepOriginalFormat 屬性的當前值
put_KeepOriginalFormat 設置圖像對象的KeepOriginalFormat 屬性
PictureChanged 通知圖像對象它的圖像資源改變了
SaveAsFile 將圖像數(shù)據(jù)存儲到流中,格式與存成文件格式相同
get_Attributes 返回圖像位屬性當前的設置

    從上面這個表可以看出,IPicture操縱著圖像對象及其屬性。圖像對象提供對位圖的抽象,而Windows負責BMP、JPG和GIF位圖的標準實現(xiàn)。程序員要做的只是實例化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 轉換為 HIMETRICspIPicture->Render(pDC, rc);      
    IPicture 負責處理所有瑣事,以便確定圖形之格式,如 Windows 位圖、JPEG或者GIF文件——甚至是圖標和元文件(metafiles)。當然啦,所有這些的實現(xiàn)細節(jié)是需要技巧的,為此我寫了一個Demo程序Myimgapp(如圖二)來示范這些IPicture的使用方法。


圖一 Myimgapp的運行畫面

    Myimgapp是個典型的MFC文檔/視圖程序,在編寫這個程序之前,我首先對 IPicture COM接口進行封裝,之所以要這么做,主要是考慮到并不是每一個程序員都能熟練運用COM接口進行編程,另外將IPicture的主要功能封裝在C++類中可以使我們的問題更容易解決,我封裝的這個C++類名字叫做CPicture。它的定義和實現(xiàn)細節(jié)請參考本文提供的源代碼。
    我在這個類中將復雜而陌生的COM風格的參數(shù)映射成MFC程序員更為熟悉的類型。例如,CPicture可以讓你直接從文件名加載一幅圖像,CFile或者CArchive,而不用去處理流,CPicture::Render替你完成了IPicture中所有令人討厭的但又是必須的HIMETRIC平滑轉換工作。CPicture甚至具備了一個Load函數(shù),它可以從資源數(shù)據(jù)中加載圖像,所以你只要用下面的代碼就可以顯示資源中的圖像:
   CPicture pic(ID_MYPIC); // 加載圖像   CRect rc(0,0,0,0);      // 使用缺省的rc   pic.Render(pDC, rc);    // 顯示圖像      
CPicture::Render提供一個顯示圖片的矩形。IPicture 對圖像進行延伸處理。如果傳遞一個空矩形,則CPicture用圖像本身的大小--不進行延伸處理。對于圖像本身而言,CPicture查找"IMAGE"類型的資源,所以在資源文件中你必須要加入下面的代碼:
   IDR_MYPIC IMAGE MOVEABLE PURE "res\\MyPic.jpg"      
    CPicture是個很棒的傻瓜類,它具備一個 ATL 智能指針CComQIPtr指向IPicture接口,通過調(diào)用OleLoadPicture來初始化不同的Load函數(shù)。CPicture提供了常用的打包函數(shù)來調(diào)用底層的IPicture。CPicture只封裝了那些在Demo例子程序中要用到的方法。如果你需要調(diào)用IPicture::get_Handle或其它一些很少用到的IPicture方法,你可以自己嘗試編寫相應的打包代碼。 另外,在編寫完CPicture之后,我發(fā)現(xiàn)了一個現(xiàn)成的MFC類——CPictureHolder,這個類的功能幾乎與CPicture完全一樣,你可以在afxctl.h文件中找到它的定義。 前面說過,Demo例子是個典型的MFC文檔/視圖應用程序,因此它肯定少不了與文檔和視圖類相對應的CPictureDoc 和CPictureView:
CPictureDoc類沒有什么特別的處理代碼,它用CPicture對象存儲圖像:
class CPictureDoc : public CDocument {protected:  CPicture m_pict; // the picture};      
并且CPictureDoc::Serialize 調(diào)用CPicture::Load 從MFC存檔的數(shù)據(jù)中讀取圖像。
void CPictureDoc::Serialize(CArchive& ar){  if (ar.IsLoading()) {    m_pict.Load(ar);  }}      
為了使Myimgapp程序更實用,CPictureDoc::OnNewDocument從程序資源數(shù)據(jù)加載了一幅圖像。為了顯示這幅圖像,CPictureView::OnDraw要調(diào)用CPicture::Render。這樣程序一啟動便會顯示一幅默認的圖像。
void CPictureView::OnDraw(CDC* pDC){  CPictureDoc* pDoc = GetDocument();  CPicture* ppic = pDoc->GetPicture();  CRect rc;  GetImageRect(rc);  ppic->Render(pDC,rc);}
    GetImageRect是CPictureView類的一個成員函數(shù),作用是根據(jù)當前Myimgapp的縮放比率(可用25%、33%、50%、75%、100%或自適應方式)獲取圖像矩形。GetImageRect調(diào)用CPicture::GetImageSize來獲得真正的圖像大小,然后根據(jù)比率顯示。 CPictureView其余的部分完全和CScrollView的做法差不多,初始化視圖并設置滾動大小,處理命令等等。唯一讓人操心的是IPicture::Render中HIMETRIC的處理問題,因為標準的MFC應用程序都使用MM_TEXT映射模型。不用擔心,CPicture::Render和CPicture::GetImageSize會將這一切轉換過來,所以你不必為這些事情傷神。 CPictureView有一個消息處理器值得一提:它就是OnEraseBkgnd,當要顯示的圖像比客戶區(qū)小的時候,這個函數(shù)必須繪制空白區(qū)域,如圖二,OnEraseBkgnd創(chuàng)建一個與圖像大小相等的切邊(clip)矩形,然后將客戶區(qū)填成黑色。之所以要創(chuàng)建切邊矩形,主要是避免當改變窗口大小時出現(xiàn)的抖動——FillRect不繪制切邊矩形內(nèi)的區(qū)域,此乃Windows圖形處理的常識。


圖二 OnEraseBkgnd 填充修剪的圖像

    IPicture/CPicture簡化了圖像的顯示。它甚至可以實現(xiàn)調(diào)色板的識別這樣復雜的處理。你完全可以拋開老式DIB 圖像繪制方法,如加載調(diào)色板、BitBlts、StretchBlts等等——這一切IPicture全都可以搞掂。如果你未曾用IPicture顯示過圖像,那么現(xiàn)在試試吧。 CPictureView完成圖像瀏覽的任務看來不是什么難事了。但是如果要把一幅圖像添加到一個對話框或者其它的什么窗口中怎么辦呢?為此我創(chuàng)建了另外一個類——CPictureCtrl。
CPictureCtrl 使你可以在任何對話框或窗口中把圖像作為子窗口顯示。例如:
class CAboutDialog : public CDialog {protected:  CPictureCtrl m_wndPict;  virtual BOOL OnInitDialog();};BOOL CAboutDialog::OnInitDialog(){  m_wndPict.SubclassDlgItem(IDC_MYIMAGE,this);  return CDialog::OnInitDialog();}      
    假設你的對話框中有一個靜態(tài)控制,它的ID=IDC_IMAGE,并且有一幅IMAGE資源的ID與之相同。則從CStaticLink派生出的CPictureCtrl還可以指定一個URL超鏈接(或者創(chuàng)建一個ID與此控制或圖像的ID相同的串資源)。如果你指定了一個URL,則在圖像上單擊鼠標將啟動默認瀏覽器訪問URL。真是酷呆了。CPicture控制著CPicture對象并改寫WM_PAINT消息處理例程,調(diào)用CPicture::Render代替通常的靜態(tài)控制處理例程。處理細節(jié)請參見代碼。打開Myimgapp程序的“關于”對話框就知道了。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在你的MFC應用程序中顯示一個JPG文件 - VC知識 - 界面程序資源 - DirectUI Skin UIPower專業(yè)界面開發(fā)與設計論壇 軟件界面|界面開發(fā) - Powered by Dis
在MFC應用程序中顯示JPG/GIF圖像文件
使用GDI+進行圖像處理
MFC 加載 和顯示圖片的幾個函數(shù)與例子 ,可以顯示任何圖片
MFC雙緩存畫圖
OpenCV讀取圖像顯示在MFC窗口上
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服