社区
图形处理/算法
帖子详情
(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
打赏
收藏
(MFC)一个函数使用的问题
我想导入图片begin.tmp 我用的bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//bitmap的定义是CBitmap bitmap; 报错是:error C2664: “LoadImageW”: 不能将参数 2 从“char [10]”转换为“LPCWSTR”
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]这样定义。
MFC
内
使用
函数
指针的
问题
许多程序员都发现,利用
MFC
或者其它的C++应用编写回调
函数
是非常麻烦的,其根本原因是回调
函数
是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将
一个
C
函数
直接作为回调
函数
,但是如果试图直接
使用
C++的成员
函数
作为回调
函数
将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员
函数
都隐含了
一个
传递
函数
作为参数,亦即“this”指针,C++通过传递
一个
指向自身的指针给其成员
函数
从而实现程序
函数
可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员
函数
一文看懂
MFC
回调
函数
使用
方法
一直
使用
C#委托得心应手,但是扯到
MFC
或者C++委托就不太清楚了,今天特地研究下
MFC
回调
函数
,在网上找了一大堆资料,但是都讲得不清不楚,对于初学者还是不会用,不过幸好找到一篇文章,就是这唯一一篇文章我一下子明白了怎么用,有时候不需要具体清楚回调
函数
原理,但是必须得会
使用
才是关键,建议大家看下这篇文章https://blog.csdn.net/hwb506/article/details/663...
mfc
实现自定义
函数
在
mfc
上实现调用自定义的
函数
MFC
的入口
函数
(main
函数
)
其实想看
MFC
的main
函数
,打开任一用
MFC
开发的App,设
一个
断点,然后查看调用堆栈。拉到最底部(即最先开始调用的东西) 在appmodul.cpp中可以看到如下代码: // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) Microsoft Corporation // A...
MFC
定时器SetTimer
函数
用法总结
CWnd类的SetTimer成员
函数
只能在CWnd类或其派生类中调用,而API
函数
SetTimer则没有这个限制,这是
一个
很重要的区别。 1、启动定时器。 启动定时器就需要
使用
CWnd类的成员
函数
SetTimer。CWnd::SetTimer的原型如下: 参数nIDEvent指定
一个
非零的定时器ID; 参数nElapse指定间隔时间,单位为毫秒; 参数lp
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章