返回信息流☆─────────────────────────────────────☆
huahua00 (lala) 于 (Thu Jul 30 17:56:29 2009) 提到:
在VS05的环境里建立的工程,使用MFC编程,选了支持unicode选项,之后就出了一些类型转换的问题。
edit1是一个EditControl类型的控件,用作输入
sum是一个EditControl类型的空间,用作输出
CString str;//想用这个保存控件里的字符值
double dsum=0;//再把字符值放到这个变量里面
edit1.GetWindowTextW(LPTSTR(LPCTSTR(str)),10);//很疑惑这里的类型转换
dsum=_wtof(str);
str.Format(dsum,10);
sum.SetWindowTextW(LPCTSTR(str));
首先是,我想选了unicode之后建立的CString应该都默认支持宽字节的,为什么
edit1.GetWindowTextW(str,10);
这样的语句是错的呢?
还有如果我选了unicode之后,LPTSTR和LPCTSTR不是应该是一种类型吗?为什么必须要强制转换2次才能通过编译?
最后,这个程序运行之后又警告,忽略之后执行,在edit1中输入了任意数字,选择执行,跳出对话框报错,选择忽略,sum控件可以正确显示数字..
☆─────────────────────────────────────☆
jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:29:26 2009) 提到:
把编译器的错误信息贴出来~~
☆─────────────────────────────────────☆
huahua00 (lala) 于 (Thu Jul 30 18:36:39 2009) 提到:
1>stdafx.cpp
1>正在编译...
1>MFC6.cpp
1>MFC6Dlg.cpp
1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(204) : warning C4244: “参数”: 从“double”转换到“UINT”,可能丢失数据
1>正在生成代码...
1>正在编译资源...
1>正在编译资源清单...
1>正在链接...
1>LINK : 没有找到 C:\Users\Feng\Documents\Visual Studio 2005\Projects\MFC6\Debug\MFC6.exe 或上一个增量链接没有生成它;正在执行完全链接
1>正在嵌入清单...
1>生成日志保存在“file://c:\Users\Feng\Documents\Visual Studio 2005\Projects\MFC6\MFC6\Debug\BuildLog.htm”
1>MFC6 - 0 个错误,1 个警告
========== 全部重新生成: 1 已成功, 0 已失败, 0 已跳过 ==========
☆─────────────────────────────────────☆
huahua00 (lala) 于 (Thu Jul 30 18:36:56 2009) 提到:
这是警告,运行的时候就有问题了。。
☆─────────────────────────────────────☆
jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:39:31 2009) 提到:
有一个问题可以回答,
LPTCSTR是常类型的LPTSTR,而GetWindowTextW的第一个参数是用来存放返回的windowtext,是要被改变的,显然不能是常数类型。
直接一次转成LPTSTR就行,没必要转两次
☆─────────────────────────────────────☆
jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:40:55 2009) 提到:
这个warning是在哪一行?
【 在 huahua00 的大作中提到: 】
: 1>stdafx.cpp
: 1>正在编译...
: 1>MFC6.cpp
: ...................
☆─────────────────────────────────────☆
huahua00 (lala) 于 (Thu Jul 30 21:32:56 2009) 提到:
这就是我疑惑的地方,如果改成你这样的话会报错
1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(195) : error C2440: “<function-style-cast>”: 无法从“CString”转换为“LPTSTR”
【 在 jokerlee 的大作中提到: 】
: 有一个问题可以回答,
: LPTCSTR是常类型的LPTSTR,而GetWindowTextW的第一个参数是用来存放返回的windowtext,是要被改变的,显然不能是常数类型。
: 直接一次转成LPTSTR就行,没必要转两次
☆─────────────────────────────────────☆
huahua00 (lala) 于 (Thu Jul 30 21:33:59 2009) 提到:
1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(204) : warning C4244: “参数”: 从“double”转换到“UINT”,可能丢失数据
str.Format(dsum,10);
这里的。。
【 在 jokerlee 的大作中提到: 】
: 这个warning是在哪一行?
☆─────────────────────────────────────☆
jokerlee (Jackal The Dire) 于 (Thu Jul 30 23:07:35 2009) 提到:
【 在 huahua00 的大作中提到: 】
: 这就是我疑惑的地方,如果改成你这样的话会报错
: 1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(195) : error C2440: “<function-style-cast>”: 无法从“CString”转换为“LPTSTR”
这句话不是说的很清楚么, CSrting 类型的变量不能隐式转换成LPTSTR, 也就是w_char*, 但是LPTSTR可以隐式转换成CString, 因为CString有一个以LPTSTR为参数的构造函数
这个问题这样解决
String str;
sum.SetWindowTextW(str.GetBuffer(0));
str.GetBuufer(0)返回一个LPTSTR, 是str内部的buffer, 也就是CString的内容。
需要注意的是, 修改通过GetBuffer()得到的字符串, 会使原来CString变量也发生改变,所以安全的做法是这样:
LPCTSTR(str.GetBuffer(0))
☆─────────────────────────────────────☆
huahua00 (lala) 于 (Fri Jul 31 11:54:15 2009) 提到:
说的很明白,谢谢了!
【 在 jokerlee 的大作中提到: 】
: 这句话不是说的很清楚么, CSrting 类型的变量不能隐式转换成LPTSTR, 也就是w_char*, 但是LPTSTR可以隐式转换成CString, 因为CString有一个以LPTSTR为参数的构造函数
: 这个问题这样解决
: String str;
: ...................
这是一条镜像帖。来源:北邮人论坛 / cpp / #26848同步于 2009/7/31
CPP机器人发帖
[合集] VS2005 遇到的一个类型转换的问题,求牛人解答!谢谢!
shenlei
2009/7/31镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。