(MFC)一个函数使用的问题

galaxy_42 2008-09-23 05:26:00
我想导入图片begin.tmp
我用的bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//bitmap的定义是CBitmap bitmap;

报错是:error C2664: “LoadImageW”: 不能将参数 2 从“char [10]”转换为“LPCWSTR”
...全文
223 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
djtop10 2009-04-02
  • 打赏
  • 举报
回复
好!在这学习了
galaxy_42 2008-09-24
  • 打赏
  • 举报
回复
按照你说的改成了 TCHAR test[]=_T("begin.bmp");
bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
第一个错误没有了,但是第二个错误还存在呢。




error C2679: 二进制“=”: 没有找到接受“HBITMAP”类型的右操作数的运算符(或没有可接受的转换)
galaxy_42 2008-09-24
  • 打赏
  • 举报
回复
非常感谢你细心的讲解
wanglei_wy 2008-09-24
  • 打赏
  • 举报
回复
//char test[] = "begin.tmp ";
TCHAR test[] = _T("begin.tmp ");
我用的bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//bitmap的定义是CBitmap bitmap;
通常MFC带字符串参数的函数都提供两个版本的,一个是ANSI版本,一个是UNICODE版本
ANSI版本的函数参数是char*,每个英文字符占用1个字节,有很多字符串类型宏LPSTR,LPCSTR的基本类型都是这个
UNICODE版本函数参数是wchat_t*,每个英文字符占用2个字节,同样的派生了LPWSTR,LPCWSTR类型宏
实际上没有LoadImage这个函数,它是一个宏:
#ifdef UNICODE
#define LoadImageW //UNICODE版本
#else
#define LoadImageA //ANSI版本
#endif
通常VC工程默认是使用UNICODE编译的,即#ifdef UNICODE是成立的,所以使用的是LoadImageW函数
而lz的第二个参数应该是被定义成char test[] = "begin.tmp ";与LoadImageW函数的第二个参数类型LPCWSTR(实际上就是wchat_t*)不匹配,所以编译器才会报错
所以通常在VC中定义字符串使用TCHAR [],它也会根据工程是否是使用UNICODE编译自动翻译成相适应的类型,而_T()宏也是起到相同的作用
查看宏函数,宏等定义可以选中该符号按F12,VC会自动跳到其定义处
设置工程编译字符集方法:工程上点击邮件->属性->Configuration Properties->General->Project Defaults/Character Set,后面的默认选项是Use Unicode Character Set,lz也可以选择Use Multi-Byte Character Set,这样你当前的工程也可以编译通过
但VC推荐使用UNICODE字符集,这样可以使你的程序更容易国际化,而且在VC08中有些ANSI版本被废除(MSDN上是这么写的,不过貌似还能用)

班门弄斧了,见笑
不介意的话贴个广告:http://topic.csdn.net/u/20080919/16/f840ef31-30b7-461e-81c2-4198b878b778.html
大家帮忙给出点注意,多谢
Occam's_Razor 2008-09-24
  • 打赏
  • 举报
回复
TCHAR test[]=_T("begin.bmp");
galaxy_42 2008-09-24
  • 打赏
  • 举报
回复
我改成这样了: TCHAR test[]="begin.bmp";
bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
但还是不行,错误还多了一个:
error C2440: “初始化”: 无法从“const char [10]”转换为“TCHAR []”,没有使该转换得以执行的上下文。
error C2679: 二进制“=”: 没有找到接受“HBITMAP”类型的右操作数的运算符(或没有可接受的转换)

c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(449): 可能是“CBitmap &CBitmap::operator =(const CBitmap &)”
试图匹配参数列表“(CBitmap, HBITMAP)”时

FIR - 2 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========



galaxy_42 2008-09-24
  • 打赏
  • 举报
回复
我改成这样了: TCHAR test[]="begin.bmp";
bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
但还是不行,错误还多了一个:
error C2440: “初始化”: 无法从“const char [10]”转换为“TCHAR []”,没有使该转换得以执行的上下文。
error C2679: 二进制“=”: 没有找到接受“HBITMAP”类型的右操作数的运算符(或没有可接受的转换)

c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(449): 可能是“CBitmap &CBitmap::operator =(const CBitmap &)”
试图匹配参数列表“(CBitmap, HBITMAP)”时

FIR - 2 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
wanglei_wy 2008-09-24
  • 打赏
  • 举报
回复
-_-! lz应该养成查MSDN的习惯
VC++的东西也是C++,强转都是通用的
TCHAR test[]=_T("begin.bmp");
HBITMAP bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
LoadImage返回类型是HANDLE, 和HBITMAP 本质上是一个东西,lz可以直接跳到该类型的定义处看看
greatws 2008-09-23
  • 打赏
  • 举报
回复
unicode的问题
binsir543 2008-09-23
  • 打赏
  • 举报
回复
同意楼上
cnzdgs 2008-09-23
  • 打赏
  • 举报
回复
把test该成TCHAR test[10]这样定义。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧