BITMAP是C++中定義的位圖結構體 HBITMAP是Windows中使用的位圖句柄 CBitmap是MFC封裝的位圖類

一:理解

BITMAP是C++中定義的位圖結構體

HBITMAP是Windows中使用的位圖句柄

CBitmap是MFC封裝的位圖類

二:相互轉換

1、HBITMAP->CBitmap 

方法一:

HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap bitmap;
bitmap.Attach(hBitmap);

方法二:

 

HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);        
CBitmap *bitmap=CBitmap::FromHandle(hBitmap);

 

注意:Attach和FromHandle的區別

 

FromHandle得到的指針是臨時變量,通過Attach連接的句柄可以長久保留,但通過FromHandle得到的只是暫時的,大概只在一個消息區間內有效,很快便會被刪除,所以基本上不能用。我用了FromHandle然後一直出錯!!!

 

實驗源碼,在(OnPaint函數中添加) 

複製代碼
CString str = _T("E:\\picture\\lena.bmp");
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap bitmap;
bitmap.Attach(hBitmap);
CPaintDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
複製代碼

注意:CBitmap類中的成員函數:

BOOL LoadBitmap(LPCTSTR lpszRecourceName);   
BOOL LoadBitmap(UINT nIDResource); 

都可以加載位圖,但他們只能加載工程中的位圖,不能像LoadImage一樣,加載硬盤中的位圖。尤其要注意:

BOOL LoadBitmap(LPCTSTR lpszRecourceName)函數中的lpszRecourceName不能爲路徑字符串。它指的是位圖的ID是用字符串表示的。 

比如:我在工程中創建了一個位圖資源IDB_BITMAP1 ,lpszResourceName是指什麼呢,是硬盤上的bitmap1.bmp嗎,如果是,以下代碼爲什麼是錯的。

複製代碼
CBitmap   bmp;   
bmp.LoadBitmap("d:\\..\\res\\bitmpa1.bmp");   
CDC   memdc;   
BITMAP   bm;   
bmp.GetBitmap(&bm);   
memdc.CreateCompatibleDC(pDC);   
memdc.SelectObject(&bmp);   
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY);  
複製代碼

用Notepad打開*.rc文件,找到類似下面一行:   

IDB_BITMAP   BITMAP   "res\\background.bmp"   
改成:Bitmap1   BITMAP   "res\background.bmp"   
或者,在VC中察看位圖資源的屬性,將其ID欄內改爲"Bitmap"(注意,一定要加引號)。
然後調用:bmp.LoadBitmap("Bitmap1"); 保證成功。   
資源可以用一個整數來標示,也可以用一個字符串標示。但無論如何,這些ID都不是指位圖文件名。
 

2、HBITMAP->BITMAP 

CString str = _T("E:\\picture\\lena.bmp");
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bm;
::GetObject(hBitmap, sizeof(bm), &bm);

3、CBitmap->BITMAP

CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
BITMAP bm;
bitmap.GetBitmap(&bm);

4、CBitmap->HBITMAP

方法一:

CBitmap bitmap;        
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap.m_hObject;

方法二:

CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap;

5、BITMAP->HBITMAP

HBITMAP hBitmap;

pbm->GetHBITMAP(NULL, &hBitmap);

6、BITMAP->CBitmap 

Bitmap* pBitmap = new Bitmap(width,height,PixelFormat24bppRGB);
HBITMAP hBitmap;
BITMAP bm;
pBitmap ->GetHBITMAP(NULL,&hBitmap);
CBitmap* bmp;
bmp.Attach(hBitmap);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章