Win32 LB_GETTEXT返回垃圾

时间:2009-04-10 22:45:49

标签: c++ string winapi listbox

我有一个问题,这很可能是一个简单的问题,但对我来说还不是一个问题。我在Win32 / C ++中使用Listbox,当从列表框中获取所选文本时,返回的字符串只是垃圾。它是结构或类似的句柄吗?

下面是代码和我得到的一个例子。

std::string Listbox::GetSelected() {
int index = -1;
int count = 0;

count = SendMessage(control, LB_GETSELCOUNT, 0, 0);

if(count > 0) {
    index = SendMessage(control, LB_GETSEL, 0, 0);
}

return GetString(index);
}


std::string Listbox::GetString(int index) {
int count = 0;
int length = 0;
char * text;

if(index >= 0) {
    count = GetItemCount();

    if(index < count) {
        length = SendMessage(control, LB_GETTEXTLEN, (WPARAM)index, 0);
        text = new char[length + 1];

        SendMessage(control, LB_GETTEXT, (WPARAM)index, (LPARAM)text);
    }
}
std::string s(text);
delete[] text;

return s;
}

GetItemCount就是这么做的。它只获取当前列表框中的项目数。

我从列表框中抓取的字符串是“Test String”并返回¨±é»Tzã

任何帮助都是明确的,谢谢。

好的,我把它缩小到我的GetSelected函数,因为GetString返回正确的字符串。

1 个答案:

答案 0 :(得分:11)

LB_GETSEL消息不返回所选项目的索引,它返回您在WPARAM中传递的ITEM的选定状态。

您还有一个严重的错误,如果没有选择任何项目,您将尝试在索引-1处检索该项目的字符串,这显然是错误的。检查这些SendMessage调用的返回值可以帮助您诊断问题。

以下是如何获取第一个选定项目的文本的示例;

// get the number of items in the box.
count = SendMessage(control, LB_GETCOUNT, 0, 0);

int iSelected = -1;

// go through the items and find the first selected one
for (int i = 0; i < count; i++)
{
  // check if this item is selected or not..
  if (SendMessage(control, LB_GETSEL, i, 0) > 0)
  {
    // yes, we only want the first selected so break.
    iSelected = i;
    break;
  }
}

// get the text of the selected item
if (iSelected != -1)
  SendMessage(control, LB_GETTEXT, (WPARAM)iSelected , (LPARAM)text);

或者,您可以使用LB_GETSELITEMS获取所选项目的列表。

相关问题