我想导入图片begin.tmp
我用的bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//bitmap的定义是CBitmap bitmap;报错是:error C2664: “LoadImageW”: 不能将参数 2 从“char [10]”转换为“LPCWSTR”

解决方案 »

  1.   

    把test该成TCHAR test[10]这样定义。
      

  2.   

    我改成这样了: 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 个 ==========
      

  3.   

    我改成这样了: 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 个 ========== 
     
     
     
      

  4.   

    TCHAR test[]=_T("begin.bmp"); 
      

  5.   

    //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
    大家帮忙给出点注意,多谢
      

  6.   

    按照你说的改成了  TCHAR test[]=_T("begin.bmp"); 
                    bitmap=(HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    第一个错误没有了,但是第二个错误还存在呢。
    error C2679: 二进制“=”: 没有找到接受“HBITMAP”类型的右操作数的运算符(或没有可接受的转换) 
      

  7.   

    -_-! 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可以直接跳到该类型的定义处看看