CString 在 MFC 中编辑控件

Posted

技术标签:

【中文标题】CString 在 MFC 中编辑控件【英文标题】:CString to Edit Control in MFC 【发布时间】:2014-12-22 18:36:13 【问题描述】:

所以我正在从 .txt 文件中检索 so 数据到 myclass(类),包括

public:
vector<int> ID
vector<string> name
vector<string> add

但是当我尝试访问它们以在 MFC dlg 的编辑框中显示它们时,它只会将这个返回到框中:

ID: 1
Name: (jibberish)
address: (jiberish)
ID: 2
Name: (jibberish)
address: (jiberish)
etc...

for循环中编辑控件框使用的代码

int s1;    
CString s2, s3;
s1.Format(_T("\r\nID: %d"),myclass.ID[i]);
s2.Format(_T("\r\nName: %s"),myclass.name[i]);
s3.Format(_T("\r\nAddress: %s"),myclass.add[i]);
Edi_box += s1 + s2 + s3;

所以它读取整数向量而不是字符串向量

【问题讨论】:

【参考方案1】:

_T 宏将根据 VS 项目的字符集设置创建 wchar_t 字符串或 char 字符串。为了将std::string(基于字符的)格式化为其中之一,您必须使用正确的转换。 Microsoft 为许多函数支持的“普通”printf() 样式语法提供了一个扩展:使用 %ls 插入 wchar_t 字符串,使用 %hs 插入 char 字符串。

注意事项:

从 wchar_t 到 char 的转换可能会失败,因此除非您已经有限制输入,否则不要期望那里的质量结果。 您不能通过省略号传递任何类类型对象,因此您需要来自 c_str() 函数的 C 风格、以 NUL 结尾的字符串。 如果您有多个向量,其中每个元素对应于另一个元素的一个元素,请使用带有结构的单个向量,这会使您的代码更加清晰。 将行尾字符(“\r\n”)放在end。 ;)

【讨论】:

这很好,但只是与 .c_str() 结合非常感谢 很高兴我能帮上忙,@FranciscoMatias。实际上我很惊讶编译器没有告诉你,因为通过省略号传递任何类对象是不正确的——也许你禁用了相应的警告?【参考方案2】:

您不能(或至少不应该)使用%s 格式化std::string。试试这个:

s2.Format( _T("\r\nName: %s"), myclass.name[i].c_str() );

对其他 std::string 变量进行同样的操作。

【讨论】:

因为Format 的可变参数列表,它无法判断你什么时候用错了。大多数无法通过原始std::string 的地方,如果您尝试,您会收到错误消息,但这里不会。 我已经试过了,但是我有更多的乱码,而不是 1 个乱码 将 .c_str 与 %hs 结合使用,它终于可以工作了。非常感谢你们俩

以上是关于CString 在 MFC 中编辑控件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MFC 在项目的所有对话框中访问变量?

MFC中TAB控件的编辑

如何从工作线程访问 MFC 控件?

编辑控件 MFC 中光标位置更改时是不是有通知代码?

MFC中Cstring转char*的问题,只能得到第一个字符是为什么呢

从 MFC 中的编辑控件写入文本 [重复]