天天看點

GDI和GDI+對象的互相轉換[r]

當然希望可以使用GDI+來完全代替GDI,再不濟也隻需要從GDI對象轉到GDI+對象。但是就是有那麼些半吊子的工程,又要新技術新特性、又希望快速開發、又不肯丢棄舊版本的已有的功能。沒辦法,隻能打更新檔。石頭、剪子、不......

1.CDC到Graphics隻要這樣:

GDI和GDI+對象的互相轉換[r]

Graphics g(pDC->GetSafeHdc());//隻要能構造CDC句柄的MFC對象都可以

GDI和GDI+對象的互相轉換[r]

//CClientDC、CPaintDC,也都可以 

GDI和GDI+對象的互相轉換[r]

2.CBitmap到Graphics需要建立一個記憶體位圖裝置:

GDI和GDI+對象的互相轉換[r]

CDC MemDC; 

GDI和GDI+對象的互相轉換[r]

CBitmap MemBitmap;

GDI和GDI+對象的互相轉換[r]

MemDC.CreateCompatibleDC(pDC);

GDI和GDI+對象的互相轉換[r]

MemBitmap.CreateCompatibleBitmap(pDC,size.cx, size.cy);

GDI和GDI+對象的互相轉換[r]

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

GDI和GDI+對象的互相轉換[r]

Graphics g(MemDC.GetSafeHdc());

GDI和GDI+對象的互相轉換[r]

///… you can work with GDI+ … ///

GDI和GDI+對象的互相轉換[r]

或者使用:

GDI和GDI+對象的互相轉換[r]

Bitmap::Bitmap(HBITMAP,HPALETTE)

以及

GDI和GDI+對象的互相轉換[r]

static Bitmap *FromHBITMAP(HBITMAP hbm,HPALETTE hpal)

3.想要用Bitmap來打開圖檔,卻又需要用GDI的繪圖函數來操作(一般都為曆史遺留問題),就需要将Bitmap對象轉換到CBitmap,可以這樣:

GDI和GDI+對象的互相轉換[r]

Bitmap* pPicture = new Bitmap(L"dotLive.jpg");

GDI和GDI+對象的互相轉換[r]

HBITMAP hBitmap;

GDI和GDI+對象的互相轉換[r]

CBitmap* pbm;

GDI和GDI+對象的互相轉換[r]

pPicture->GetHBITMAP(Color(0,0,0),&hBitmap);

GDI和GDI+對象的互相轉換[r]

pbm = CBitmap::FromHandle(aaa1);

GDI和GDI+對象的互相轉換[r]

///… use pbm to do the GDI works 

GDI和GDI+對象的互相轉換[r]

///

GDI和GDI+對象的互相轉換[r]

pbm->DeleteObject();//要記得删除GDI對象,否則你會發現你的記憶體占用…

GDI和GDI+對象的互相轉換[r]
GDI和GDI+對象的互相轉換[r]

CView使用OnPaint列印圖像就是一個例子,使用GDI+無法在列印紙上列印出圖像,隻有一片空白。在找到原因之前,隻好從GDI+轉換到GDI使用BitBlt和StretchBlt方式來列印。

4.儲存Bitmap,打開很友善,儲存就不那麼的友善了。Bitmap或者Image打開圖像會自動鎖定檔案,儲存時會産生檔案被使用之類的錯誤。一種折衷的辦法是,儲存時全新建立一個Bitmap(Image)對象,将原來的對象畫到新對象上,然後将原來的對象删除以釋放檔案。儲存新對象。不能用clone,它會将鎖定的檔案資源一塊複制過來,則解鎖檔案需要的釋放對象就又多了一個。

GDI和GDI+對象的互相轉換[r]

Bitmap* tPic= new Bitmap(L"dotLive.jpg");//鎖定檔案

GDI和GDI+對象的互相轉換[r]

Bitmap* pPicture = new Bitmap(tPic->GetWidth()

GDI和GDI+對象的互相轉換[r]

                                         ,tPic->GetHeight()

GDI和GDI+對象的互相轉換[r]

                                         ,tPic->GetPixelFormat());

GDI和GDI+對象的互相轉換[r]

Graphics g(pPicture);

GDI和GDI+對象的互相轉換[r]

g.DrawImage(tPic,0,0,m_nWidth,m_nHeight);//複制過來

GDI和GDI+對象的互相轉換[r]

delete tPic;//解鎖

GDI和GDI+對象的互相轉換[r]

/// … use the pPicture to access "dotLive.jpg" … ///

GDI和GDI+對象的互相轉換[r]

CLSID tiffClsid;

GDI和GDI+對象的互相轉換[r]

GetEncoderClsid(L"image/jpeg", &tiffClsid);//這個函數MSDN中有

GDI和GDI+對象的互相轉換[r]

pPicture->Save(L"dotLive.jpg" ,&tiffClsid);//儲存

GDI和GDI+對象的互相轉換[r]

5.Graphics到HDC,想要用Bitmap友善打開圖像,又要往圖像裡寫文字作圖等。糟糕的是由于曆史遺留問題,這些操作都是使用GDI完成的。并且GDI+沒有異或繪圖模式(實作橡皮筋效果)、沒有文字輸出底色不透明、字元串需要轉換到WChar。咋辦呢,可以這樣轉:

GDI和GDI+對象的互相轉換[r]

Bitmap* pPicture = new Bitmap(L"dotLive.jpg");//打開圖檔

GDI和GDI+對象的互相轉換[r]

Graphics tempG(pPicture );

GDI和GDI+對象的互相轉換[r]

HDC hdc = tempG.GetHDC ();//獲得GDI句柄

GDI和GDI+對象的互相轉換[r]

CDC* tempDC = CDC::FromHandle(hdc);

GDI和GDI+對象的互相轉換[r]

/// … hurry up, draw what you want … ///

GDI和GDI+對象的互相轉換[r]

tempG.ReleaseHDC(hdc); //要記得relese,GDI都需要釋放,否則資源會被占用而不接受其他操作

GDI和GDI+對象的互相轉換[r]

路漫漫其修遠兮 吾将上下而求索

本文轉自 lu xu 部落格園部落格,原文連結: http://www.cnblogs.com/dotLive/archive/2006/08/25/486588.html  ,如需轉載請自行聯系原作者

繼續閱讀