Win32 LB_GETTEXT возвращает мусор - PullRequest
5 голосов
/ 11 апреля 2009

У меня есть проблема, которая, скорее всего, простая, но, тем не менее, проблема для меня. Я использую Listbox в Win32 / C ++, и когда я получаю выделенный текст из моего списка, возвращаемая строка является просто мусором. Это дескриптор структуры или аналогичный?

Ниже приведен код и пример того, что я получаю.

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 просто делает это. Он просто получает количество элементов, находящихся в данный момент в списке.

Строка, которую я извлекал из списка, это «Тестовая строка», и она вернулась ¨ ± é »Tzã

Любая помощь определена, спасибо.

Хорошо, я сократил ее до своей функции GetSelected, поскольку GetString возвращает правильную строку.

1 Ответ

11 голосов
/ 11 апреля 2009

Сообщение LB_GETSEL не возвращает индекс выбранного элемента, оно возвращает выбранное СОСТОЯНИЕ ПУНКТА, который вы передаете в WPARAM.

У вас также есть серьезная ошибка, когда, если ни один элемент не выбран, вы попытаетесь получить строку элемента с индексом -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, чтобы получить список выбранных элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...