C++-MFC(11)-HBITMAP,CBITMAP,BITMAP 基本定義與使用

在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);


 

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