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

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

//CClientDC、CPaintDC,也都可以

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

CDC MemDC;

CBitmap MemBitmap;

MemDC.CreateCompatibleDC(pDC);

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

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

Graphics g(MemDC.GetSafeHdc());
///… you can work with GDI+ … ///
或者使用:

Bitmap::Bitmap(HBITMAP,HPALETTE)
以及

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

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

HBITMAP hBitmap;

CBitmap* pbm;

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

pbm = CBitmap::FromHandle(aaa1);
///… use pbm to do the GDI works
///

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


CView使用OnPaint列印圖像就是一個例子,使用GDI+無法在列印紙上列印出圖像,隻有一片空白。在找到原因之前,隻好從GDI+轉換到GDI使用BitBlt和StretchBlt方式來列印。
4.儲存Bitmap,打開很友善,儲存就不那麼的友善了。Bitmap或者Image打開圖像會自動鎖定檔案,儲存時會産生檔案被使用之類的錯誤。一種折衷的辦法是,儲存時全新建立一個Bitmap(Image)對象,将原來的對象畫到新對象上,然後将原來的對象删除以釋放檔案。儲存新對象。不能用clone,它會将鎖定的檔案資源一塊複制過來,則解鎖檔案需要的釋放對象就又多了一個。

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

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

,tPic->GetHeight()

,tPic->GetPixelFormat());

Graphics g(pPicture);

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

delete tPic;//解鎖
/// … use the pPicture to access "dotLive.jpg" … ///

CLSID tiffClsid;

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

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

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

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

Graphics tempG(pPicture );

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

CDC* tempDC = CDC::FromHandle(hdc);
/// … hurry up, draw what you want … ///

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

路漫漫其修遠兮 吾将上下而求索
本文轉自 lu xu 部落格園部落格,原文連結: http://www.cnblogs.com/dotLive/archive/2006/08/25/486588.html ,如需轉載請自行聯系原作者