博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于CBitmap,LoadBitmap 的使用
阅读量:3978 次
发布时间:2019-05-24

本文共 2854 字,大约阅读时间需要 9 分钟。

LoadBitmap

1.Platform SDK
如果位图的ID定义为IDB_BITMAP1则
HBITMAP hBitmap=LoadBitmap(AfxGetInstanceHandle(),(LPSTR)IDB_BITMAP1);
如果位图的ID定义为"IDB_BITMAP1"则
HBITMAP hBitmap=LoadBitmap(AfxGetInstanceHandle(),"IDB_BITMAP1");
2.CBitmap::LoadBitmap()
CBitmap* pBitmap=new CBitmap;
pBitmap->LoadBitmap(IDB_BITMAP1); //位图资源ID定义为IDB_BITMAP1  
关于CBitmap的使用

‍在初始化CBitmap对象时,常用Cbitmap::LoadBitmap,即如下两种:

BOOL   LoadBitmap(   LPCTSTR   lpszRecourceName   );  
BOOL   LoadBitmap(   UINT   nIDResource   );  
MSDN中的说明为:
" 返回值调用成功时返回非零值,否则为0。  
lpszResourceName指向一个包含了位图资源名字的字符串(该字符串以null结尾)。NIDResource指定位图资源中资源的ID号。说明本函数从应用的可执行文件中加载由lpszResourceName指定名字或者由nIDResource指定的ID号标志的位图资源。加载的位图被附在Cbitmap对象上。如果由lpszResourceName指定名字的对象不存在,或者没有足够的内存加载位图,函数将返回0。可以调用函数CgdiObject::DeleteObject删除由LoadBitmap加载的位图,否则Cbitmap的析构函数将删除该位图对象。警告     在删除位图对象之前,要保证它没有被选到设备上下文中。在Windows3.1以及以后的版本中,增加了如下的位图:OBM_UPARROWIORM_DNARROWIOBM_RGARROWIOBM_LFARROWI ......"
刚开始用的时候,我直接把图像路径名给了 lpszRecourceName,可总是不成功.仔细检查了程序,也没发现错误.可为什么呢?...CSDN一查才发现问题出在 lpszRecourceName上. lpszRecourceName按字面意思好像是"指向资源的名称字符串",可实际呢?却不是一般理解的磁盘上的资源文件名,而是VC工程内部已导入的资源名,所以把外部文件的名称赋给它当然不成功了.问题怎么解决呢?---用API函数HBITMAP LoadImage("文件名");不过该函数返回的是指向Load图片的句柄,所以需要用到CBitmap的Attach方法:
直接从外部文件加载图片

HBITMAP bitmap;

bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_backBitmap.DeleteObject();
if(!m_backBitmap.Attach(bitmap))
{
   MessageBox("导入背景图失败!","提示",MB_OK);
   return;
}

****************************************

void CitemView::getBitMap( CDC *pDC )
{
CDC   MemDC;  
HBITMAP hBmp;
BITMAP   bm;  
CBitmap Bitmap;
CPoint point( 10, 10);
CString cStr;
//hBmp = (HBITMAP)::LoadImage(NULL,"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
Bitmap.DeleteObject();
Bitmap.Attach( hBmp );
Bitmap.GetObject(sizeof(BITMAP),&bm);  
MemDC.CreateCompatibleDC(pDC);  
MemDC.SelectObject(&Bitmap);  
pDC->BitBlt(point.x, point.y, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);  
MemDC.DeleteDC();
}

***************************************************
请问LoadBitmap( LPCTSTR lpszResourceName )中lpszResourceName 是指哪个名字

BOOL   LoadBitmap(   LPCTSTR   lpszResourceName   );  

BOOL   LoadBitmap(   UINT   nIDResource   );  
nIDResource   是指资源ID  
但lpszResourceName是指什么呢  

比如:我创建了一个BITMAP资源IDB_BITMAP1     ;   lpszResourceName是指什么呢,是硬盘上  

的bitmap1.bmp吗,如果是,以下代码为什么是错的。  
   
CBitmap   bmp;  
bmp.LoadBitmap("d:\\..\\res\\bitmpa1.bmp");  
CDC   memdc;  
BITMAP   bmstru;  
bmp.GetBitmap(&bmstru);  
memdc.CreateCompatibleDC(pDC);  
memdc.SelectObject(&bmp);  
    pDC->BitBlt(0,0,bmstru.bmWidth,bmstru.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都不是指位图文件名。不要将它们混淆。
LoadBitmap的参数不论那种类型都是针对资源而言,CBitmap是不提供直接从文件中读取位图的功能的!

转载地址:http://qqhki.baihongyu.com/

你可能感兴趣的文章
FreeBSD系统安装
查看>>
FreeBSD利用ports安装MySQL+Apache+PHP+phpMyAdmin
查看>>
一段简单的php分页代码示例
查看>>
Fckeditor修改增加字体和字体大小
查看>>
apache的静态/动态编译在apache+php+mysql的应用
查看>>
简单的滑动tab
查看>>
svn命令说明
查看>>
测试人员要掌握的基本的SQL语句(上)
查看>>
Javascript中最常用的55个经典技巧
查看>>
Linux上Apache反向代理之ProxyPass IIS网站总结
查看>>
Nginx介绍 – Nginx是什么?
查看>>
CGI
查看>>
关于大型论坛系统环境搭建(20万日IP负载平衡实战)–Nginx+Apache2+PHP+MySQL
查看>>
惠普前总裁孙振耀指点职业规划。(迄今见过的最好的职业规划的文章,毕生受益)!!!!
查看>>
windows xp cmd下开启telnet
查看>>
js实时显示系统时间
查看>>
js隐藏导航菜单
查看>>
mysql里的varchar值转换为可排序的值(MySql varchar排序 CAST ,CONVERT)
查看>>
表单特效-点击左侧选项选入右侧选择框
查看>>
Javascript实现子窗口向父窗口传值(转)
查看>>