我需要将文本附加到win32编辑控件我有工作功能来执行此操作,但编辑控件中打印的文本为什么? 示例代码取自here
的microsoft示例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中调用:
std::string ss("wwwwww");
settext(hwnd,ss);
更新
即使我这样做了:
SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)s.c_str());
通过编辑,但仍然打印的字符是gibrish
如果我这样做:
LPSTR pst = s.c_str()
它没有通过编译错误:
错误C2440:'初始化':无法从'const char *'转换为'LPSTR'
答案 0 :(得分:4)
我的猜测是你的应用程序是为Unicode编译的,所以窗口将你的ANSI C字符串解释为Unicode C字符串,因此来自另一种语言的字符。
答案 1 :(得分:2)
问题在于
LPSTR pst = &s[0];
未终止。你需要使用
LPCSTR pst = s.c_str();
答案 2 :(得分:1)
无法保证&s[0]
为空终止,因此您可能只是看到任何随机内存,直到字符串结尾后出现空值。可能在某些编译器/库中,它在某些/所有时间都会被终止,因此到目前为止还没有浮出水面。
您希望改为使用s.c_str()
。
答案 3 :(得分:0)
您可以将LPSTR转换为带有ATL的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 /多字节)。您也可以使用明确将ANSI转换为WIDE的A2W,但无论您是否在Unicode模式下编译,A2T始终都会做正确的事。
A2T实际上在堆栈上为结果字符串分配了足够的空间,因此您不必担心释放它。