将字符串添加到列表框会导致奇怪的字符

时间:2013-02-17 19:55:31

标签: c++ windows winapi visual-studio-2012

我已经创建了一个使用WIN32将字符串发送到列表框的函数

char data[] = "abcd";

addToList(hWnd,data);

void addToList(HWND hWnd,char data[] ){
  SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data);    
}

当我执行此操作时,它将数据发送到列表框但问题出现在奇怪的字符中,我也尝试了wchar_t但问题仍然存在

1 个答案:

答案 0 :(得分:4)

首先,您应该检查API调用是否有错误。您需要检查所有API函数调用的返回值。

那说,考虑到问题中的代码,

SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data); 

如果这导致项目被添加到列表框中,则表​​示GetDlgItem确实返回了有效的窗口句柄,而data确实指向了有效的内存。在这种情况下,您报告的唯一解释是编码的文本不匹配。

因此,我们可以假设SendMessage宏评估为SendMessageW。由于您传递的是ANSI编码文本,因此不匹配会解释症状。该函数将文本视为UTF-16编码。

一个明显的解决方案是使用SendMessageA代替。但是,在我看来,更好的解决方案是传递UTF-16编码数据。

wchar_t data[] = L"abcd";
....
void addToList(HWND hWnd, const wchar_t *data)
{
    SendMessage(GetDlgItem(hWnd,IDC_LISTBOX), LB_ADDSTRING, 0, (LPARAM)data);    
}

显然,您的代码会添加我在开始时提到的错误检查。