Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35

Передать элементы из combo в list

09.03.2020, 21:37. Показов 953. Ответов 16

Студворк — интернет-сервис помощи студентам
Задание выглядит так : при выборе элемента из комбобокса в листбоксе появляется информация об этом элементе. Я создал эти листы, заполнил их. Да, знаю, что листбокс не надо заполнять ещё, но просто, чтобы пустой не был. Знаю так же, что нужно по индексу определить элемент и передавать выбранный в листбокс, но как это реализовать. Очень много гуглил, но там в основном делают через диалог или винформ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#undef UNICODE
 
#include <windows.h>
#define ID_LISTBOX 3000
#define LISTBOX_1 502
 
HINSTANCE hInstance;
HWND      hWindow;
HWND      hCombo;
HWND      hList;
 
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
        hCombo = CreateWindow("COMBOBOX", "combobox",         //создание комбобокса 
            WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST,
            10, 50, 250, 500, hWnd, 0, hInstance, 0);
        ShowWindow(hCombo, SW_SHOW); //показываем окошко
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T1");  //добавляем элементы в комбобокс
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T2");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T3");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T4");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T5");
        hList = CreateWindow("LISTBOX", "ListBox1", WS_CHILD | LBS_EXTENDEDSEL,  //создание листбокса 
            10, 80, 120, 80, hWnd, (HMENU)LISTBOX_1, NULL, NULL);
        //char string[10] = " stroka ";
        ShowWindow(hList, SW_SHOW); // показываем листбокс
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"First");
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"Second");
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"Third");
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"Fourth");
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"Fifth");
        break;
        //////////////////////////////////////////////////////////////////////
    case WM_COMMAND:
        int index;
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        UnregisterClass("window", hInstance);
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
 
 
void MyCreateWindow_ComBox()
{
 
    WNDCLASS wnd; memset(&wnd, 0, sizeof(WNDCLASS));
    wnd.lpfnWndProc = WindowProc;
    wnd.lpszClassName = "window";
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    wnd.hbrBackground = CreateSolidBrush(0xEFEFEF);
 
    RegisterClass(&wnd);
 
    hWindow = CreateWindow("window", "ComboBox", WS_OVERLAPPEDWINDOW,   //создание окошка
        200, 200, 400, 300, 0, 0, hInstance, 0);
    ShowWindow(hWindow, SW_SHOW); //показываем окошко
   
    //SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)PCHAR(string));
    
 
}
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreviuos, LPSTR lpCmdLine, int nCmdShow)
{
    ::hInstance = hInstance;
    MyCreateWindow_ComBox();
    while (true)
    {
        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2020, 21:37
Ответы с готовыми решениями:

Как передать элементы List по порядку в 6 событий?
У меня есть 6 событий к примеру public List Code { get; set; } ....и т. д. И есть список var list = new List(); (он уже заполнен...

Combo Box/ dropdown list
Добрый день, вчера решил одну проблему и вот тут же появилась вторая, которая не даёт покоя. 1) Хотелось бы чтоб в Combo Box, по...

Занесение в БД значений из двух Combo c++ по значению Combo из бд
Здравствуйте, подскажите, пожалуйста на форме два combobox`a и кнопка, в боксах загружены водители FIO и машины номера их, Num. Как мне...

16
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 09:43
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Задание выглядит так : при выборе элемента из комбобокса в листбоксе появляется информация об этом элементе. Я создал эти листы, заполнил их. Да, знаю, что листбокс не надо заполнять ещё, но просто, чтобы пустой не был. Знаю так же, что нужно по индексу определить элемент и передавать выбранный в листбокс, но как это реализовать. Очень много гуглил, но там в основном делают через диалог или винформ.
Для начала тебе нужно определиться, какую именно информацию содержать элементы в комбобоксе, т.е. - что такое "Т1" и какие атрибуты у него есть.
Потом обработать CBN_SELCHANGE и заполнить листбокс этой информацией.
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 14:04  [ТС]
Дело в том, что я хочу хотя бы по индексу вытянуть сообщения, которые есть в комбобокс и передать эти сообщения в лист.
Нашел полезную информацию, но в листбоксе не выводит ничего.
C++
1
2
3
4
5
6
7
8
 case WM_COMMAND:
        
        char name[100];
        int index;
        index = SendMessage(hCombo, CB_GETCURSEL, 0, 0L);
        SendMessage(hList, LB_GETTEXT, (WPARAM)index, (LPARAM)name);
 
        break;
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 14:18
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Нашел полезную информацию, но в листбоксе не выводит ничего.
Нам, наверное, надо использовать CB_GETLBTEXT
Ну и явно не при обработке WM_COMMAND, а ниже
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 17:48  [ТС]
То есть, ниже в WM_CREATE?

Добавлено через 1 минуту
Написал ниже в Create и все так же ничего.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 17:52
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
То есть, ниже в WM_CREATE?
Нет. WM_COMMAND - это общее сообщение для целой кучи команд. Конкретная команда/конторл определены в wParam
C++
1
2
3
4
5
6
7
8
case WM_COMMAND:
{
   switch(LOWORD(wParam)) //   switch(HIWORD(wParam)) 
   {
//Где-то здесь
   }
}
break;
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 20:28  [ТС]
Хорошо, спасибо, попробую.

Добавлено через 16 минут
Жаль, не помогло(
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 20:46
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Жаль, не помогло(
Во-первых, покажи код.
Во-вторых, распиши-ка ещё раз словами, что ты пытаешься сделать. А то из всего предыдущего, я нифига не понимаю что именно.
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 20:50  [ТС]
Показываю код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#undef UNICODE
 
#include <windows.h>
#define ID_LISTBOX 3000
#define LISTBOX_1 502
 
HINSTANCE hInstance;
HWND      hWindow;
HWND      hCombo;
HWND      hList;
 
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
 
    switch (uMsg)
    {
    case WM_CREATE:
        hCombo = CreateWindow("COMBOBOX", "combobox",         //создание комбобокса 
            WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST,
            10, 50, 250, 500, hWnd, 0, hInstance, 0);
        ShowWindow(hCombo, SW_SHOW); //показываем окошко
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T1");  //добавляем элементы в комбобокс
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T2");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T3");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T4");
        SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)"T5");
 
        hList = CreateWindow("LISTBOX", "ListBox1", WS_CHILD | LBS_EXTENDEDSEL,  //создание листбокса 
            10, 80, 120, 80, hWnd, (HMENU)LISTBOX_1, NULL, NULL);
 
        ShowWindow(hList, SW_SHOW); // показываем листбокс
        break;
        //////////////////////////////////////////////////////////////////////
    case WM_COMMAND:
        
        char name[100];
        int index;
        index = SendMessage(hCombo, CB_GETCURSEL, 0, 0L);
        SendMessage(hList, LB_GETTEXT, (WPARAM)index, (LPARAM)name);
 
        break;
        /*TCHAR buff[250];
        *((LPWORD)buff) = (WORD)SendMessage(hCombo, EM_LINELENGTH, 0, 0);
        SendMessage(hList, EM_GETLINE, 0, (LPARAM)buff);*/
    case WM_DESTROY:
        PostQuitMessage(0);
        UnregisterClass("window", hInstance);
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
 
 
void MyCreateWindow_ComBox()
{
 
    WNDCLASS wnd; memset(&wnd, 0, sizeof(WNDCLASS));
    wnd.lpfnWndProc = WindowProc;
    wnd.lpszClassName = "window";
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    wnd.hbrBackground = CreateSolidBrush(0xEFEFEF);
 
    RegisterClass(&wnd);
 
    hWindow = CreateWindow("window", "ComboBox", WS_OVERLAPPEDWINDOW,   //создание окошка
        200, 200, 400, 300, 0, 0, hInstance, 0);
    ShowWindow(hWindow, SW_SHOW); //показываем окошко
   
    //SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)PCHAR(string));
    
 
}
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreviuos, LPSTR lpCmdLine, int nCmdShow)
{
    ::hInstance = hInstance;
    MyCreateWindow_ComBox();
    while (true)
    {
        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}
Мне нужно сделать так, чтобы при выборе элемента в комбобокс, он появлялся в листбоксе. Мне некоторые ребята подсказали что это нужно делать в case wm command.
Сейчас хочу передать индекс элемента хотя бы в листбокс. Создаю индекс, приравниваю его с сообщением об нахождении индекса CB_GETCURSEL и кидаю сообщение листбоксу, но не могу понять, почему не показывает ничего в листбоксе.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 21:01
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Мне некоторые ребята подсказали что это нужно делать в case wm command.
Я ж тебе вроде писал выше про CBN_SELCHANGE. Это первое.
Второе - я так понимаю, тебе нужно тупо выделить элемент в лист-боксе. Наверное, здесь надо посылать LB_SETCURSEL, а не LB_GETTEXT
В-третьих, ты бы как-то научился работать с сообщениями windows.
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 21:32  [ТС]
Можешь написать, как это примерно будет выглядеть?

Добавлено через 28 минут
Вот кусочек кода, который отвечает моему заданию. Какие ошибки в нем?
C++
1
2
3
4
5
6
7
8
9
10
11
 switch (HIWORD(wParam))
        {
        case CBN_SELCHANGE:
 
            char name[100];
            int index;
            index = SendMessage(hCombo, CB_GETCURSEL, 0, 0L);
            SendMessage(hList, CB_GETLBTEXT, (WPARAM)index, (LPARAM)name);
 
            break;
        }
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 21:38
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Вот кусочек кода, который отвечает моему заданию. Какие ошибки в нем?
Да никаких. Ты получаешь текущий индекс из комбо-бокса, потом получаешь текст (кстати, я там соврал - для лист-бокса нужен-таки LB_GETTEXT, но сейчас это не имеет значения) из лист-бокса в буфер. А что должно быть в результате?
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 21:43  [ТС]
Хочу, чтобы было так. Получаю текущий элемент из комбобокса и отправляю его в листбокс. Только при выборе элемента в комбобоксе, в листбоксе ничего не высвечивается
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 21:46
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Хочу, чтобы было так. Получаю текущий элемент из комбобокса и отправляю его в листбокс. Только при выборе элемента в комбобоксе, в листбоксе ничего не высвечивается
Т.е. вот так не пробовал?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Второе - я так понимаю, тебе нужно тупо выделить элемент в лист-боксе. Наверное, здесь надо посылать LB_SETCURSEL, а не LB_GETTEXT
И - у тебя лист-бокс вроде пустой, может тебе нужно туда добавить элементы?
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 21:51  [ТС]
Так как раз я в этом кусочке кода, что выше привёл и нахожу индекс из комбо и передаю его в лист. Но в листе, при выборе в комбо, ничего нет. А зачем лист заполнять чем-то, если он должен отображать элемент, который мы выбрали в комбо?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.03.2020, 22:05
Цитата Сообщение от NicolasKeydghhh Посмотреть сообщение
Так как раз я в этом кусочке кода, что выше привёл и нахожу индекс из комбо и передаю его в лист. Но в листе, при выборе в комбо, ничего нет. А зачем лист заполнять чем-то, если он должен отображать элемент, который мы выбрали в комбо?
Где ты увидел здесь слово "передаёшь"?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Да никаких. Ты получаешь текущий индекс из комбо-бокса, потом получаешь текст (кстати, я там соврал - для лист-бокса нужен-таки LB_GETTEXT, но сейчас это не имеет значения) из лист-бокса в буфер. А что должно быть в результате?
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 35
10.03.2020, 22:49  [ТС]
я имел ввиду получаю индекс в листбокс этим сообщением
C++
1
SendMessage(hList, LB_GETTEXT, (WPARAM)index, (LPARAM)name);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2020, 22:49
Помогаю со студенческими работами здесь

List Box. Копирование выделенных строк в Combo Box
Здравствуйте форумчане! Выручайте. Я проболела 2 недели. Пока болела вся группа познакомилась с Delphi. Нужно срочно сдавать вот...

Элементы в Combo, которые невозможно редактировать
Как сделать так чтобы в комбо можно было выбирать итемы, но чтоб их нельзя было редактировать? В стандартных свойствах че то такого не...

Записать в файл по очереди элементы List<string> и List<char>
У меня есть List с string элементами и есть List с char элементами. Как сделать чтобы у файл записывались последователь сначало string...

Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой
Дан двумерный массив List&lt;List&lt;string&gt;&gt; , состоящий из двух строк, как его отсортировать по первой строке, чтобы элементы второй строки...

Как добавить элементы одного List к другому List
public class groupIndicators { public string Name { get; set; } //Наименование группы индикаторов public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru