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


 

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