SetDlgItemText用垃圾填充编辑字段

时间:2016-07-13 12:17:42

标签: string encoding cdialog

在我的CDialog派生类中,在OnInitDialog()方法中,我预先填充了从预先存在的配置加载的先前配置的编辑字段。

SetDlgItemText(IDC_EDIT1, LPCTSTR(data->project_file.c_str()));
SetDlgItemText(IDC_EDIT2, LPCTSTR(data->remote_addr.c_str()));

project_fileremote_addr都属于std::string类型。它们被正确填充,包含相关文件名和主机名的字符串(在调试器下检查)。

但是,对话框项目分别显示㩆慜瑩噜獩楳屭獁整屲浴㙰䌷⹃浴⹰瑩c췍췍췍췍췍췍﷽﷽翹㤱⸲㘱⸸⸰㐷촀췍。当我将数据输入到它们中时,它们可以被正确读取,并且它们的数据可以相对轻松地转换为std :: string。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于在我的编译中LPCTSTR是16位,std :: string的8位c_str()被误解。它必须转换为wstring,并且只有c_str()才能正确设置值。

#include <locale>

void MyDialog::SetDlgItemStdString(UINT id, std::string entry)
{
#ifndef UNICODE
    SetDlgItemText(id, LPCTSTR(entry.c_str()));
#else
    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> conv;
    std::wstring entry_wstring = conv.from_bytes(entry);
    SetDlgItemText(id, LPCTSTR(entry_wstring.c_str()));
#endif
}