在MFC中,如果要操作位圖,必然會用到HBITMAP,CBITMAP,BITMAP。
首先區分概念:
BITMAP是C++中定義的位圖結構體。
HBITMAP是Windows中使用的位圖句柄。
CBitmap是MFC封裝的位圖類。
1.定義與使用
1.1 HBITMAP指針 從文件中錄入指針,得到文件句柄
1.2 CBITMAP類 只能下載工程中的位圖資源
1.3BITMAP 結構體,得到位圖中的
還可參看MFC中GDI之MFC中GDI之CBitmap
2.類型之間的互相轉換
1.定義與使用
1.1 HBITMAP指針 從文件中錄入指針,得到文件句柄
//文件中錄入指針,得到文件句柄
//1、HBITMAP->CBitmap Attach
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap cbitmap;
cbitmap.Attach(hBitmap);
//2.得到的指針是臨時變量 FromHandle
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap *pcbitmap=CBitmap::FromHandle(hBitmap);
//HBITMAP LoadImage從文件中錄入bmp文件
//FromHandle得到的指針是臨時變量
//Attach連接的句柄可以長久保留
OnPaint()
{
CString str = _T("E:\\picture\\lena.bmp");
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap cbitmap;
cbitmap.Attach(hBitmap);
CPaintDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&cbitmap);
CRect rect;
GetClientRect(&rect);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
}
1.2 CBITMAP類 只能下載工程中的位圖資源
//獲取位圖句柄中的數據
//GetBitmapBits只提供給16位版本的窗口
//GetDIBBits
//第一種方法:
HBITMAP hbitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(32710), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
GetObject(hbitmap, sizeof(BITMAP), &bitmap);
//第二種方法:
bitmap.bmWidth = 23;
bitmap.bmHeight = 23;
bitmap.bmBitsPixel = 32;
bitmap.bmWidthBytes = (bitmap.bmWidth * bitmap.bmBitsPixel / 8 + 3) / 4 * 4;;
1.3BITMAP 結構體,得到位圖中的
//位圖資源IDB_BITMAP1
//BOOL LoadBitmap(LPCTSTR lpszRecourceName)
//BOOL LoadBitmap(UINT nIDResource);
//函數中的lpszRecourceName不能爲路徑字符串。
//它指的是位圖的ID是用字符串表示的。
//IDB_BITMAP BITMAP "res\\background.bmp"
//改成:Bitmap1 BITMAP "res\background.bmp"
CBitmap cbmp;
cbmp.LoadBitmap("Bitmpa1");
CDC memdc;
BITMAP bm;
cbmp.GetBitmap(&bm); //資源變結構體
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bmp);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY);
2.類型之間的互相轉換
//1.CBitmap->BITMAP
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
BITMAP bm;
bitmap.GetBitmap(&bm);
//2.CBitmap->HBITMAP
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap.m_hObject;
//3.BITMAP->HBITMAP
HBITMAP hBitmap;
pbm->GetHBITMAP(NULL, &hBitmap);
//4.BITMAP->CBitmap
Bitmap* pBitmap = new Bitmap(width,height,PixelFormat24bppRGB);
HBITMAP hBitmap;
BITMAP bm;
pBitmap ->GetHBITMAP(NULL,&hBitmap);
CBitmap* bmp;
bmp.Attach(hBitmap);