當然希望可以使用GDI+來完全代替GDI,再不濟也只需要從GDI對象轉到GDI+對象。但是就 是有那麼些工程,又要新技術新特性、又希望快速開發、又不肯丟棄舊版本的已有的功能。 沒辦法,只能縫縫補補,咔哐碙啌...
一、CDC到Graphics只要這樣:
Graphics g(pDC->GetSafeHdc());//只要能構造CDC句柄的MFC對象都可以
//CClientDC、CPaintDC,也都可以
二、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);
三、想要用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對象,否則你會發現你的內存占用 …
四、保存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);//保存
五、 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都需要釋放,否則資源會被占用而不接受其 他操作
關於GDI+、圖像處理以及.net編程,歡迎到來討論。