//定义了三个编辑框控件 接受num1 num2 num3   void CTestDlg::OnBnClickedButton1()   //响应按钮 add
{
// TODO: 在此添加控件通知处理程序代码
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowTextW(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(ch2,10); num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2; itoa(num3,ch3,10); GetDlgItem(IDC_EDIT3)->SetWindowTextW(ch3);//当计算好num1+num2 显示在第三个编辑框控件中}
出现错误
f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(75) : error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(76) : error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(84) : error C2664: “CWnd::SetWindowTextW”: 不能将参数 1 从“char [10]”转换为“LPCTSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

以前遇到这种问题一直是在问题处加 _T()  就行 
但是这里加就会发出错误
f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(75) : error C2065: “Lch1”: 未声明的标识符1.在以前的书上都是用的GetWindowText  现在的好多函数都加W  这是为什么呢??
2.还有加_T是什么意思啊???
3.帮忙解决上面的错误 
谢谢  请各位积极发言!!!!!!!!

解决方案 »

  1.   


    把GetWindowTextW改成GetWindowText
    把char ch1[10],ch2[10],ch3[10]  改成TCHAR ch1[10],ch2[10],ch3[10];
      

  2.   

    1、W后缀的函数集表明使用的是宽字符集,
    2、_T == _TEXT,是一个宏,如果你定义了Unicode就是宽字符,等价于WCHAR,否则是ANSI字符集,等价于CHAR
      

  3.   

    如果按照楼上锁改,就会产生下面的错误
    f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(84) : error C2664: “atoi”: 不能将参数 1 从“TCHAR [10]”转换为“const char *”
    1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
    1>f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(85) : error C2664: “atoi”: 不能将参数 1 从“TCHAR [10]”转换为“const char *”
    1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
    1>f:\visual studio 2008\projects\mydialog\mydialog\testdlg.cpp(88) : error C2664: “itoa”: 不能将参数 2 从“TCHAR [10]”转换为“char *”
    1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
    请各位帮忙把1,2两个问题也解决一下  thanks
      

  4.   

    1. W 是unicode版本。2. _T 是自动进行 unicode/ansi版本匹配。 如 _T("aa") 在unicode环境下就是 wchar_t* "aa"; ansi环境下就是 char* "aa";3.  将 char ch1,... 改成 TCHAR ch1,...
      

  5.   

    ps. 除非特殊需求,否则不要显示的调用W unicode版本。直接使用名称,系统会自动进行ansi/unicode匹配。
      

  6.   

    晕。照理说,不会出现3楼那样的编译错误,至少俺以前那样使用不会出问题。因为如果没定义_UNICODE,ch1、ch2、ch3本身就是一个char*,不存在不能转换的问题俺手里头没有VS,没法现场调试。
      

  7.   

    LPTSTR xxx=_T(chl[0]);
    GetDlgItem(IDC_EDIT1)->GetWindowTextW(xxx,10);
    类似
      

  8.   

    那俺给个建议,这样肯定行
    CString szNum1(ch1);
    int num1 = atoi(szNum1);这样肯定木问题
      

  9.   

    void CTestDlg::OnBnClickedButton1()   //响应按钮 add
    {
        // TODO: 在此添加控件通知处理程序代码
        int num1,num2,num3;
        TCHAR ch1[10],ch2[10],ch3[10];
        GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
        GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);    num1=_ttoi(ch1);
        num2=_ttoi(ch2);
        num3=num1+num2;    _itoa(num3,ch3,10);    GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//当计算好num1+num2 显示在第三个编辑框控件中}
      

  10.   

    如果用LPTSTR(ch1)将其强制转化  没有错误  ,
    不过实际的程序的执行得不到正确的结果
      

  11.   

    或者:
    void CTestDlg::OnBnClickedButton1()   //响应按钮 add
    {
        // TODO: 在此添加控件通知处理程序代码
        int num1,num2,num3;
        WCHAR ch1[10],ch2[10],ch3[10];
        GetDlgItem(IDC_EDIT1)->GetWindowTextW(ch1,10);
        GetDlgItem(IDC_EDIT2)->GetWindowTextW(ch2,10);    num1=_wtoi(ch1);
        num2=_wtoi(ch2);
        num3=num1+num2;    _itow(num3,ch3,10);    GetDlgItem(IDC_EDIT3)->SetWindowTextW(ch3);//当计算好num1+num2 显示在第三个编辑框控件中}
      

  12.   

    10楼的会出现这个错误:
    error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”11楼和1楼的方法一样  都不可以实现
    会出现错误:
    atoi”: 不能将参数 1 从“TCHAR [10]”转换为“const char *” 
      

  13.   

    说错了 11楼的方法和一楼的不一样 
    这个和13楼的错误一样
    不过仍会得到错误
    error C2664: “_itoa”: 不能将参数 2 从“TCHAR [10]”转换为“char *”
      

  14.   


            int num1,num2,num3;
    WCHAR ch1[10],ch2[10],ch3[10]; //这里用WCHAR
    GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
    GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10); num1=_wtoi(ch1); //这里用_wtoi
    num2=_wtoi(ch2);
    num3=num1+num2; _itow(num3,ch3,10);  //这里改成_itow可以 GetDlgItem(IDC_EDIT3)->SetWindowText((LPTSTR)ch3);
    改成上面的可以用  但是会出现警告
    warning C4996: '_itow': This function or variable may be unsafe. Consider using _itow_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>        d:\program files\microsoft visual studio 9.0\vc\include\wchar.h(878) : 参见“_itow”的声明
      

  15.   

    void CTestDlg::OnBnClickedButton1()   //响应按钮 add
    {
        // TODO: 在此添加控件通知处理程序代码
        int num1,num2,num3;
        CString str1, str2, str3;
        GetDlgItem(IDC_EDIT1)->GetWindowText(str1);
        GetDlgItem(IDC_EDIT2)->GetWindowText(ch2);    num1=_ttoi((LPCTSTR)str1);
        num2=_ttoi((LPCTSTR)str2);
        num3=num1+num2;    _itoa(num3,(TCHAR*)str3.GetBuffer(10),10);
        str3.ReleaseBuffer();    GetDlgItem(IDC_EDIT3)->SetWindowText(str3);//当计算好num1+num2 显示在第三个编辑框控件中}
      

  16.   


    void CTestDlg::OnBnClickedButton1()   //响应按钮 add
    {
        // TODO: 在此添加控件通知处理程序代码
        int num1,num2,num3;
        TCHAR ch1[10],ch2[10],ch3[10];
        GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
        GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);    num1=_ttoi(ch1);
        num2=_ttoi(ch2);
        num3=num1+num2;    _itot(num3,ch3,10);    GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//当计算好num1+num2 显示在第三个编辑框控件中}
      

  17.   


    因为你工程选项里头是Unicode字符集,你用CString后自动转为PXSTR,别用atoi itoa之类的函数,而是用带t的函数_ttoi _itot_s等来转
      

  18.   

    18楼的灰出现错误
    error C2664: “_itoa”: 不能将参数 2 从“TCHAR *”转换为“char *”本人用的是VS2008
      

  19.   


    _itoa->_itot
      

  20.   


    这个警告没关系,也可以用_itow_s_itow_s(num3,ch3,10, 10);
      

  21.   

    hhaa,楼主在用孙鑫的MFC吧。。我也刚刚碰到
      

  22.   

    lin的方法很好,我的一改就成功了,非常感谢撒!
      

  23.   

    没看明白,我只要遇到char, char*,LTSTR类似这样的类型转换就犯晕