CBitmap、HBITMAP、BITMAP相互转换

一:理解函数

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);
相关文章
相关标签/搜索