Как заполнить ListBox с помощью SendMessage?

Я пытаюсь заполнить 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?

PaulMcKenzie 30.03.2024 17:02

Myline — это строка ввода из текстового файла.

Ronnie 30.03.2024 18:24

Мой вопрос в том, что на самом деле объявлено как myline? Я знаю, каково ваше намерение myline, но вам нужно точно указать, что такое myline с точки зрения типа переменной.

PaulMcKenzie 30.03.2024 20:15

Если, например, myline — это std::string, то вы должны использовать (LPARAM) myline.c_str()

Remy Lebeau 31.03.2024 00:01

Вы можете использовать макрос ListBox_AddString, чтобы избежать приведения.

zett42 31.03.2024 03:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно отправить сообщение 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'| и я не уверен, почему. Спасибо вам за ваши предложения.

Ronnie 31.03.2024 15:41
string[20] — массив из 20 строк. Вам нужно использовать одну строку с этим API, как показано в моем примере. Кроме того, возможна другая ошибка, поскольку вы объявляете локальные переменные внутри оператора case, не ограничивая их область действия внутри блока { }, например: case SomeValue: { HWND hwndLB = ...; ... break; }
Remy Lebeau 31.03.2024 18:47

Спасибо, но остались проблемы...

Ronnie 01.04.2024 18:34

@Ронни, я обновил свой ответ. Но если после этого у вас все еще возникают проблемы, вам необходимо обновить свой вопрос, чтобы предоставить минимально воспроизводимый пример, демонстрирующий конкретную проблему, с которой вы столкнулись. Вы упускаете важные детали.

Remy Lebeau 01.04.2024 21:17

Реми – Большое-большое спасибо за помощь!!! Я использовал "...SendMessage(hwndLB, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(myline.c_str()));..." и это сработало!! Как я узнаю вашу помощь. Это было здорово! Береги себя... Ронни

Ronnie 02.04.2024 17:48

Другие вопросы по теме