【问题标题】:Adding a string to a listbox results in weird characters将字符串添加到列表框会导致奇怪的字符
【发布时间】:2013-02-17 19:55:30
【问题描述】:

我制作了一个使用 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 但问题仍然存在

【问题讨论】:

  • 什么奇怪的字符?是中文的吗?在哪种情况下你的程序是Unicode,SendMessageSendMessageWwchar_t data[] = L"abcd"会解决问题吗?
  • 您是否尝试在窗口过程中使用断点进行调试以查看 LPARAM 是否正确?
  • 您的代码不能同时是 C 和 C++。请选择一个。
  • 模糊的标题不太可能对未来的访问者有用。

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


【解决方案1】:

首先,您应该检查 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);    
}

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

【讨论】:

  • +1,是不是有一个 windowsx 包装器,或者一个控制宏来捕获无效字符指针?自从我这样做以来已经很长时间了。只是好奇。
  • @WhozCraig 你在想ListBox_AddString吗?
  • 谢谢,这是一个很好的答案,但我仍然有问题,因为wchar_t data 变量必须包含来自float variable 的数据,而且我不知道如何转换!我该如何解决?
  • 嗯,我不知道。这完全是一个不同的问题。当你问这个问题时,一定要选择你的语言。 C 和 C++ 完全不同。
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 2019-09-18
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多