青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

如果你是一個使用VB編程的程序員,要在程序中顯示JPG或者GIF圖像簡直易如反掌,將圖像控件拖到Form中,分分鐘即可搞掂。但是C++程序員要顯示同樣的圖形卻沒有那么輕松,那么是不是要自己編寫JPG解壓縮代碼呢?當然不用那么復雜啦!本文將針對這個問題討論如何在MFC中顯示JPG或者GIF圖像。
    用VB寫圖像顯示程序之所以如此輕松,完全是利用了琳瑯滿目的圖像處理控件,把你想要做的事情都一一搞掂。而C++程序員為了實現相同的功能必須忙乎半天。其實,C/C++程序員也能使用那些VB程序員所用的(或者說幾乎一樣的)圖像控件。VB用的圖像控件實際上都基于一個系統級COM類——IPicture。下面是有關 IPicture 的方法描述:
方法 描述
get_Handle  返回圖像對象的Windows GDI句柄 
get_Hpal  返回圖像對象當前使用的調色板拷貝
get_Type 返回當前圖像對象的的圖像類型
get_Width  返回當前圖像對象的圖像寬度
get_Height  返回當前圖像對象的圖像高度
Render  在指定的位置、指定的設備上下文上繪制指定的圖像部分
set_Hpal  設置當前圖像的調色板
get_CurDC  返回當前選中這個圖像的設備上下文
SelectPicture  將一個位圖圖像選入給定的設備上下文,返回選中圖像的設備上下文和圖像的GDI句柄
get_KeepOriginalForma  返回圖像對象KeepOriginalFormat 屬性的當前值
put_KeepOriginalFormat  設置圖像對象的KeepOriginalFormat 屬性
PictureChanged  通知圖像對象它的圖像資源改變了
SaveAsFile  將圖像數據存儲到流中,格式與存成文件格式相同
get_Attributes  返回圖像位屬性當前的設置

    從上面這個表可以看出,IPicture操縱著圖像對象及其屬性。圖像對象提供對位圖的抽象,而Windows負責BMP、JPG和GIF位圖的標準實現。程序員要做的只是實例化IPicture,然后調用其Render函數。與通常使用接口的方式不同,這里實例的創建我們不用CoCreateInstance函數,而是用一個專門的函數OleLoadPicture。

IStream* pstm = // 需要一個流(stream)
IPicture* pIPicture;
hr = OleLoadPicture(pstm, 0, FALSE, IID_IPicture, (void**)&pIPicture);      
OleLoadPicture從流中加載圖像并創建一個可用來顯示圖像的新IPicture對象。
rc = // 顯示圖像的矩形
// 將rc 轉換為 HIMETRIC
spIPicture->Render(pDC, rc);      
    IPicture 負責處理所有瑣事,以便確定圖形之格式,如 Windows 位圖、JPEG或者GIF文件——甚至是圖標和元文件(metafiles)。當然啦,所有這些的實現細節是需要技巧的,為此我寫了一個Demo程序Myimgapp(如圖二)來示范這些IPicture的使用方法。


圖一 Myimgapp的運行畫面

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


圖二 OnEraseBkgnd 填充修剪的圖像

    IPicture/CPicture簡化了圖像的顯示。它甚至可以實現調色板的識別這樣復雜的處理。你完全可以拋開老式DIB 圖像繪制方法,如加載調色板、BitBlts、StretchBlts等等——這一切IPicture全都可以搞掂。如果你未曾用IPicture顯示過圖像,那么現在試試吧。 CPictureView完成圖像瀏覽的任務看來不是什么難事了。但是如果要把一幅圖像添加到一個對話框或者其它的什么窗口中怎么辦呢?為此我創建了另外一個類——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();
}      
    假設你的對話框中有一個靜態控制,它的ID=IDC_IMAGE,并且有一幅IMAGE資源的ID與之相同。則從CStaticLink派生出的CPictureCtrl還可以指定一個URL超鏈接(或者創建一個ID與此控制或圖像的ID相同的串資源)。如果你指定了一個URL,則在圖像上單擊鼠標將啟動默認瀏覽器訪問URL。真是酷呆了。CPicture控制著CPicture對象并改寫WM_PAINT消息處理例程,調用CPicture::Render代替通常的靜態控制處理例程。處理細節請參見代碼。打開Myimgapp程序的“關于”對話框就知道了。

posted on 2008-04-26 11:10 wrh 閱讀(1217) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            猫咪成人在线观看| 欧美日本在线一区| 最新国产拍偷乱拍精品 | 亚洲第一黄色| 亚洲国产精品电影| 亚洲国产一区二区视频| 亚洲国产欧美久久| 一区二区三区欧美亚洲| 亚洲影视在线播放| 久久久www成人免费精品| 欧美一区二区日韩| 免费在线视频一区| 亚洲精品乱码久久久久久久久 | 欧美日韩精品免费观看视频完整| 欧美色网一区二区| 国产日韩综合| 91久久国产精品91久久性色| 亚洲午夜久久久| 久久久久久网址| 亚洲人成在线观看| 欧美一级欧美一级在线播放| 久久综合久久综合九色| 欧美日韩另类在线| 极品日韩久久| 亚洲视频在线看| 久久久一二三| 在线中文字幕一区| 久久天堂av综合合色| 欧美视频在线观看免费| 一区二区在线观看视频| 亚洲女性裸体视频| 亚洲第一精品夜夜躁人人躁| 西瓜成人精品人成网站| 欧美日韩成人一区二区| 在线国产精品播放| 欧美专区福利在线| 亚洲视频在线观看网站| 欧美激情1区2区3区| 国产亚洲精品bt天堂精选| 国产精品99久久99久久久二8| 欧美91精品| 久久久精品日韩| 国产色爱av资源综合区| 亚洲欧美另类在线观看| 亚洲精品在线三区| 欧美精品乱码久久久久久按摩| 一区二区亚洲精品国产| 久久免费的精品国产v∧| 亚洲欧美中文字幕| 国产精品专区第二| 欧美一区二区三区免费视| 在线亚洲美日韩| 国产精品av免费在线观看| 在线视频你懂得一区| 亚洲日本成人女熟在线观看| 欧美黑人国产人伦爽爽爽| 亚洲第一精品夜夜躁人人爽 | 国产情侣一区| 国产日韩欧美一二三区| 亚洲免费在线视频一区 二区| 亚洲精品久久久久久下一站| 欧美丰满高潮xxxx喷水动漫| 亚洲三级电影在线观看| 亚洲第一黄网| 欧美aa在线视频| 在线观看成人小视频| 欧美成人综合一区| 免费观看欧美在线视频的网站| 国产亚洲欧美另类一区二区三区| 久久国产直播| 欧美在线视频一区| 亚洲成色777777在线观看影院| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲第一黄色| 亚洲黄网站在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲国产精品激情在线观看| 亚洲电影免费观看高清完整版在线| 免费观看成人www动漫视频| 9l视频自拍蝌蚪9l视频成人| 艳女tv在线观看国产一区| 国产精品视频999| 裸体女人亚洲精品一区| 免费在线日韩av| 99这里只有精品| 欧美一二三视频| 亚洲激情偷拍| 亚洲一级在线观看| 激情综合激情| 一区二区免费在线视频| 国内精品久久国产| 亚洲高清电影| 国产精品一区视频| 欧美激情黄色片| 国产精品国产三级国产专播精品人| 久久精品成人一区二区三区蜜臀 | 欧美成人国产| 欧美一级精品大片| 欧美成人一区二区三区| 亚洲欧美三级在线| 老司机午夜精品| 午夜在线视频一区二区区别| 久久亚洲电影| 欧美一区二区日韩| 欧美日韩国产二区| 男女av一区三区二区色多| 国产精品盗摄一区二区三区| 另类专区欧美制服同性| 欧美性猛交xxxx免费看久久久| 免费在线欧美黄色| 国产亚洲激情视频在线| 一区二区三区不卡视频在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 国产真实久久| 一区二区三区四区国产精品| 在线观看一区二区视频| 亚洲综合国产精品| 日韩午夜激情av| 久久嫩草精品久久久精品| 西西人体一区二区| 欧美日韩免费| 免费看的黄色欧美网站| 国产综合色在线| 亚洲一区二区三区四区中文| 日韩午夜在线电影| 美日韩精品免费| 蜜桃av综合| 黑人极品videos精品欧美裸| 午夜精品久久久久久久白皮肤| 亚洲伊人色欲综合网| 欧美精品一区三区| 亚洲激情第一页| 亚洲国产婷婷香蕉久久久久久99| 久久国产综合精品| 久久女同精品一区二区| 国产一区久久| 久久精品一区二区三区中文字幕| 久久国产精品亚洲va麻豆| 国产麻豆精品theporn| 亚洲在线不卡| 久久成年人视频| 国产亚洲欧美日韩一区二区| 欧美一级在线视频| 玖玖综合伊人| 亚洲欧洲精品一区二区精品久久久| 久久久91精品国产| 麻豆91精品91久久久的内涵| 亚洲电影在线看| 欧美承认网站| 99国产精品视频免费观看一公开| 亚洲午夜久久久久久尤物| 国产精品美女午夜av| 午夜视频一区二区| 蜜臀99久久精品久久久久久软件| 亚洲成人在线网站| 欧美日产在线观看| 亚洲综合精品四区| 六月天综合网| 99在线观看免费视频精品观看| 欧美肉体xxxx裸体137大胆| 亚洲欧美精品一区| 欧美a一区二区| 亚洲视频精选| 国产在线拍偷自揄拍精品| 老司机免费视频久久| av成人免费观看| 久久久精品999| 一本久道久久久| 国产一区自拍视频| 欧美日韩国产精品自在自线| 午夜精品久久久久久99热软件| 亚洲电影自拍| 久久国产精品99国产| 日韩一区二区精品视频| 国产亚洲激情视频在线| 欧美视频久久| 麻豆精品精华液| 国产主播精品| 亚洲一区二区毛片| 欧美成人午夜| 欧美制服第一页| 亚洲六月丁香色婷婷综合久久| 国产精品草莓在线免费观看| 久色婷婷小香蕉久久| 亚洲欧美日韩视频二区| 亚洲精品欧美极品| 免费黄网站欧美| 欧美在线欧美在线| 亚洲午夜激情免费视频| 亚洲国产成人在线播放| 国产日韩欧美视频| 国产精品青草久久久久福利99| 欧美激情片在线观看| 久久亚洲春色中文字幕| 欧美一区二区三区免费观看| 99re66热这里只有精品3直播 | 国语自产精品视频在线看| 国产精品爱久久久久久久| 欧美韩日亚洲| 欧美mv日韩mv国产网站app|