Я пытаюсь заполнить ListBox данными, которые читаю из текстового файла, но безуспешно. Я попробовал несколько способов сделать это SendMessage (см. ниже), но получил ту же ошибку «неверный тип приведения».
Список:
CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL|
LBS_NOTIFY, 20, 90, 200, 365,
hwnd, (HMENU)LST_LISTBOX, NULL, NULL);
Продолжаю менять SendMessage:
SendMessage(LST_LISTBOX, LB_INSERTSTRING, 0, (LPARAM)10); //myline[i]);
SendMessage(LST_LISTBOX, LB_ADDSTRING, 0, (LPARAM) myline[i]);
SendMessage(GetDlgItem(hwnd, LST_LISTBOX), LB_ADDSTRING, 0, (LPARAM) myline[i] );
Как лучше всего заполнить список из файла?
Myline — это строка ввода из текстового файла.
Мой вопрос в том, что на самом деле объявлено как myline? Я знаю, каково ваше намерение myline, но вам нужно точно указать, что такое myline с точки зрения типа переменной.
Если, например, myline — это std::string, то вы должны использовать (LPARAM) myline.c_str()
Вы можете использовать макрос ListBox_AddString, чтобы избежать приведения.





Вам нужно отправить сообщение HWND, который CreateWindow() создаёт. Вы можете получить это из возвращаемого значения CreateWindow() или из GetDlgItem() после завершения CreateWindow().
LPARAM для LB_ADDSTRING и LB_INSERTSTRING должен быть указателем на первый символ строки в стиле C с нулевым завершением, например:
char myline[size];
//fill myline as needed...
HWND hwndLB = CreateWindowA(WC_LISTBOXA, ... hwnd, reinterpret_cast<HMENU>(LST_LISTBOX), ...);
// or:
// CreateWindowA(...);
// HWND hwndLB = GetDlgItem(hwnd, LST_LISTBOX);
SendMessage(hwndLB, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(myline));
Альтернативно:
std::string myline;
//fill myline as needed...
HWND hwndLB = ...;
SendMessage(hwndLB, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(myline.c_str()));
ОБНОВЛЕНИЕ: судя по опубликованным вами комментариям, myline кажется массивом std::string[20], поэтому вам нужно индексировать массив и вызывать c_str() для нужного элемента, например:
SendMessage(hwndLB, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(myline[i].c_str()));
Реми – Спасибо за ваши предложения. КОГДА я пробую альтернативный подход, я получаю следующую ошибку: C:\Users\Ronnie\Cpp\Paper.cpp|85|ошибка: запрос члена «c_str» в «myline», который имеет тип, не относящийся к классу «std: :__cxx11::string [20] {он же std::__cxx11::basic_string<char> [20]}'| C:\Users\Ronnie\Cpp\Paper.cpp|147|ошибка: переход к метке регистра [-fpermissive]| C:\Users\Ronnie\Cpp\Paper.cpp|69|примечание: пересекает инициализацию 'HWND__* hwndLB'| и я не уверен, почему. Спасибо вам за ваши предложения.
string[20] — массив из 20 строк. Вам нужно использовать одну строку с этим API, как показано в моем примере. Кроме того, возможна другая ошибка, поскольку вы объявляете локальные переменные внутри оператора case, не ограничивая их область действия внутри блока { }, например: case SomeValue: { HWND hwndLB = ...; ... break; }Спасибо, но остались проблемы...
@Ронни, я обновил свой ответ. Но если после этого у вас все еще возникают проблемы, вам необходимо обновить свой вопрос, чтобы предоставить минимально воспроизводимый пример, демонстрирующий конкретную проблему, с которой вы столкнулись. Вы упускаете важные детали.
Реми – Большое-большое спасибо за помощь!!! Я использовал "...SendMessage(hwndLB, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(myline.c_str()));..." и это сработало!! Как я узнаю вашу помощь. Это было здорово! Береги себя... Ронни
Что такое
myline?