首页 > 代码库 > CBitmap、HBITMAP、BITMAP相互转换

CBitmap、HBITMAP、BITMAP相互转换

一:理解

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

实验源码,在(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、HBITMAP、BITMAP相互转换