2016-07-13 2 views
0

내 CDialog 파생 클래스에서 OnInitDialog() 메서드를 사용하여 기존 구성에서 이전 구성을로드하여 편집 필드를 미리 채 웁니다.SetDlgItemText로 편집 필드를 채우기

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으로 변환됩니다.

내가 뭘 잘못하고 있니?

답변

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 
} 
관련 문제