概述
一:理解
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);
方法二:
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 "resbackground.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 bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap.m_hObject;
方法二:
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)bitmap;
5、BITMAP->HBITMAP
HBITMAP hBitmap;
pbm->GetHBITMAP(NULL, &hBitmap);
6、BITMAP->CBitmap
Bitmap* pBitmap = new Bitmap(width,height,PixelFormat24bppRGB); HBITMAP hBitmap; BITMAP bm; pBitmap ->GetHBITMAP(NULL,&hBitmap); CBitmap* bmp; bmp.Attach(hBitmap);
最后
以上就是如意铃铛为你收集整理的CBitmap、HBITMAP、BITMAP相互转换的全部内容,希望文章能够帮你解决CBitmap、HBITMAP、BITMAP相互转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复