程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> GDI和GDI+對象的相互轉換

GDI和GDI+對象的相互轉換

編輯:關於VC++

當然希望可以使用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編程,歡迎到來討論。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved