LoadBitmap(const char FAR *)与LoadBitmap(UINT)的区别 LoadBitmap(lpString);应该是用来读BMP文件,而不是资源中的位图。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 areslee,你误解了LoadBitmap(),有2种形式,一种可以装载bmp文件,一种可以装载资源中的位图。但它们之间的区别呢,为何一个能显示一个不能? LoadBimap(UNIT)是从资源中加载位图。LoadBitmap(const char Far * )是从一个位图文件中加载。使用LoadBitmap(Unit)你必须在你的资源中加入一个位图,参数是该位图资源的ID 大错特错!LoadBitmap的参数不论那种类型都是针对资源而言,CBitmap是不提供直接从文件中读取位图的功能的!使用的形式无非是:cBitmap.LoadBitmap(IDB_MYBMP);cBitmap.LoadBitmap(MAKEINTRESOURCE(IDB_MYBMP));两种的效果一样,都是对资源而言!所谓的LPCTSTR和UINT类型参数,只是类型强制转换达到的!请看:#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))#ifdef UNICODE#define MAKEINTRESOURCE MAKEINTRESOURCEW#else#define MAKEINTRESOURCE MAKEINTRESOURCEA#endif // !UNICODE也许MS为了以后的资源可以变为32位,才提供的LPCTSTR类型的转换! 真实的情况是这样的,CBitmap的LoadBitmap函数的两种形式都是针对资源的,一个资源可以用字符串名字标志,也可以用整数ID表示,比如你可以定义位图的ID为IDB_BITMAP1,也可以定义位图的名称为"BITMAP1", 效果一样,只是对于不同的定义法要用LoadBitmap的不同形式。全局函数LoadBitmap的参数才是指文件名. Holly说的对极了LoadBitmap只能装资源,而不能读文件的。要读文件话,要用LoadImage这个API函数。得到HBITMAP句柄后,用Cbitmap类的Attach. to ad:你怎么还没开窍!::LoadBitmap()也是一样的!::LoadImage()要读文件的话,需要将参数fuLoad设置LR_LOADFROMFILE标记! 总之只要是LoadBitmap函数就不可以读文件,不管类成员还是全局! 楼上的各位网兄的热切关注,lumg表示万分的感谢。还得向各位指导一下,lumg按照上述要点上机操作了一下,果真可以实现Load Image in the dialog,但运行时仍有报错,系统提示Attach有错。现将代码呈上: CBitmap cBitmap; char lpString[256]; cBitmap.LoadBitmap(cBitmap.Attach((HBITMAP)LoadImage(NULL,lpString,IMAGE_BITMAP,0,0,LR_LOADFROMFILE ))); 不知哪个参数有误,请指示。 cBitmap.LoadBitmap(cBitmap.Attach((HBITMAP)LoadImage(...))) ???!!!不用这样调用,你用cBitmap.Attach((HBITMAP)LoadImage(...));就已经把位图放到cBitmap中了,为何你还用LoadBitmap来处理Attach的返回值!? 谢谢Holly,谢谢各位,我终于成功了。 关于zeromemory传参数时的一个疑问??? 简单的两句,vc6通过,vc9报错 C++ 网络编程之路怎么走?看哪些书?什么顺序? CObList 如何回到当前POSITION的前10条记录的地方啊 求教,多线程安全问题? 什么是swf sdk 怎样让对话框程序“不失去”焦点? 怎样获得当前机器的桌面路径和“开始->程序”文件夹的路径? SDI中对话框中得到的变量值如何传到VIEW类中? 如何用VC操作数据库 .obj,.lib,.dll,.h之间的相互关系。 如何实现先出现一个选项对话框,确定后,进入主程序
LoadBitmap的参数不论那种类型都是针对资源而言,CBitmap是不提供直接从文件中读取位图的功能的!
使用的形式无非是:
cBitmap.LoadBitmap(IDB_MYBMP);
cBitmap.LoadBitmap(MAKEINTRESOURCE(IDB_MYBMP));
两种的效果一样,都是对资源而言!
所谓的LPCTSTR和UINT类型参数,只是类型强制转换达到的!请看:
#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
#endif // !UNICODE
也许MS为了以后的资源可以变为32位,才提供的LPCTSTR类型的转换!
要读文件话,要用LoadImage这个API函数。
得到HBITMAP句柄后,用Cbitmap类的Attach.
你怎么还没开窍!
::LoadBitmap()也是一样的!
::LoadImage()要读文件的话,需要将参数fuLoad设置LR_LOADFROMFILE标记!
有错。现将代码呈上:
CBitmap cBitmap;
char lpString[256];
cBitmap.LoadBitmap(cBitmap.Attach((HBITMAP)LoadImage(NULL,lpString,IMAGE_BITMAP,0,0,LR_LOADFROMFILE )));
不知哪个参数有误,请指示。
不用这样调用,你用
cBitmap.Attach((HBITMAP)LoadImage(...));
就已经把位图放到cBitmap中了,为何你还用LoadBitmap来处理Attach的返回值!?