一:理解函數
BITMAP是C++中定義的位圖結構體
this
HBITMAP是Windows中使用的位圖句柄spa
CBitmap是MFC封裝的位圖類指針
二:相互轉換code
一、HBITMAP->CBitmap orm
方法一:blog
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都不是指位圖文件名。
二、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);
三、CBitmap->BITMAP
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
BITMAP bm;
bitmap.GetBitmap(&bm);
四、CBitmap->HBITMAP
方法一:
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap.m_hObject;
方法二:
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap;
五、BITMAP->HBITMAP
HBITMAP hBitmap;
pbm->GetHBITMAP(NULL, &hBitmap);
六、BITMAP->CBitmap
Bitmap* pBitmap = new Bitmap(width,height,PixelFormat24bppRGB); HBITMAP hBitmap; BITMAP bm; pBitmap ->GetHBITMAP(NULL,&hBitmap); CBitmap* bmp; bmp.Attach(hBitmap);