我需要将文本附加到win32编辑控件中,我有工作功能可以做到这一点,但编辑控件中打印的文本是gibrish为什么?示例代码取自微软示例
void settext(HWND hDlg,std::string s)
{
//std::wstring ws;
//ws.assign( s.begin(), s.end() );
//LPWSTR pwst = &ws[0];
//// get temporary LPCWSTR (pretty safe)
//LPCWSTR pcwstr = ws.c_str();
//SetDlgItemText(hWndEdit, IDC_EDIT1,pcwstr);
HWND hWndEdit = GetDlgItem (hDlg, IDC_EDIT1);
LPSTR pst = &s[0];
int ndx = GetWindowTextLength (hWndEdit);
SetFocus (hWndEdit);
#ifdef WIN32
SendMessage (hWndEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
#else
SendMessage (hWndEdit, EM_SETSEL, 0, MAKELONG (ndx, ndx));
#endif
SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)pst);
}
并且从DlgProc im调用:
std::string ss("wwwwww");
settext(hwnd,ss);
更新
即使我按照这里的建议做:
SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)s.c_str());
通过编译,但印刷的字符仍然是吉布里什
如果我这样做:
LPSTR pst = s.c_str()
它没有通过编译-错误:
错误C2440:"initializing":无法从"const char*"转换为"LPSTR"
我的猜测是,您的应用程序是为Unicode编译的,因此窗口将您的ANSI C字符串解释为Unicode C字符串,因此字符来自另一种语言。
问题是
LPSTR pst = &s[0];
不是null终止的。你需要使用
LPCSTR pst = s.c_str();
不能保证&s[0]
是null终止的,所以您可能只是看到那里有任何随机内存,直到字符串结束后出现null。可能在一些编译器/库中,它在某些时候/所有时候都是null终止的,因此直到现在才出现。
您将需要使用s.c_str()
。
您可以使用ATL将LPSTR转换为LPWSTR,以便Unicode API可以对其进行消化。
#include <windows.h>
#include <atlbase.h>
void settext(HWND hDlg,std::string s)
{
USES_CONVERSION;
LPSTR pst = A2T(s.c_str());
A2T将窄字符串转换为与当前编译设置兼容的字符串(Unicode/多字节)。您也可以使用A2W,它明确地将ANSI转换为WIDE,但无论您是否以Unicode模式编译,A2T都会做正确的事情。
A2T实际上在堆栈上为生成的字符串分配了足够的空间,所以您不需要担心释放它