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

Нужен ваш совет по WinAPI (Combobox, Path)

23.04.2018, 11:01. Показов 1700. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть программа которая открывает файл и по заданным вершинам ищет, так вот у меня вопрос: на картинке вы можете увидеть мою программу, и под (1) я хочу передавать туда путь к файлу после того как я его открыл. Как я это думал делать

C++
1
2
3
.................................. 
hFilePathEdit = CreateWindowW(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 690, 100, 200, 21, hWnd, (HMENU)ID_FILE_PATH_EDIT, hInst, NULL);
 ........................................
SendMessage(hFilePathEdit, CB_ADDSTRING, 0, (LPARAM)file.lpstrFile);
Но оно не работает. Также если вы посмотрите на картинку (2) Combobox , когда я там выбираю что-то, мне этот выбор нужно фиксировать. Но я не нашел где это сохраняется в Combobox
Миниатюры
Нужен ваш совет по WinAPI (Combobox, Path)  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2018, 11:01
Ответы с готовыми решениями:

Нужен ваш совет
Вот делал свое дитё месяц и пару дней назад запустил Нужна ваша оценка дизайна. Дайте пожалуйста совет как улучшить и что добавить для...

Нужен ваш совет
Добрый день. Появилась необходимость работы с клиентами не только в офисе, но и через WEB. Пока только начинаю знакомится с...

нужен совет ваш
добрый день скажите пожалуйста,вот я хочу пойти на курсы по Курсы системных администраторов, курсы по ремонту ПК,вот программа...

39
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
23.04.2018, 12:11
Цитата Сообщение от dimaSlon Посмотреть сообщение
Но оно не работает.
Не логично создавать EDIT, а потом передавать ему специфичные команды от COMBOBOX.
C++
1
2
3
4
5
6
7
HWND hFilePathEdit = CreateWindowW(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 690, 100, 200, 21, hWnd, (HMENU)ID_FILE_PATH_EDIT, hInst, NULL);
...
WCHAR wcFilename[MAX_PATH];
...
SetWindowTextW(hFilePathEdit, wcFilename);
...
GetWindowTextW(hFilePathEdit, wcFilename, MAX_PATH);
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
23.04.2018, 12:35  [ТС]
Ygg, я сделал так
C++
1
SendMessage(hFilePathEdit, WM_SETTEXT, 0, (LPARAM)file.lpstrFile);
Добавлено через 3 минуты
Ygg, а как в Combobox доставать какие значения я выбрал, не подскажете?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
23.04.2018, 12:54
dimaSlon, текущее значение поля ввода у COMBO можно доставать через GetWindowText,
индекс в списке выбора у COMBO можно запросить через CB_GETCURSEL.
Многое зависит от стилей COMBO и как именно вы его используете.
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
23.04.2018, 13:00  [ТС]
Все что связано с COMBO
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
hStartVertexCombo = CreateWindowW(L"Combobox", NULL,
        WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
        540, 150, 120, 110, hWnd, NULL, 
        hInst, NULL);
 
 
    hEndVertexCombo = CreateWindowW(L"Combobox", NULL,
        WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
        770, 150, 120, 110, hWnd, NULL, 
        hInst, NULL);
................................
if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hStartVertexCombo, CB_SHOWDROPDOWN, (WPARAM)TRUE, 0);
        return;
    }
    
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hEndVertexCombo, CB_SHOWDROPDOWN, (WPARAM)TRUE, 0);
        return;
    }
................
if (GetOpenFileName(&file) != FALSE)
    {
        ....................................................
 
        for (const Vector& vertex : vertexBuffer)
        {
            const auto vertexStr = toWString(vertex);
 
            SendMessage(hStartVertexCombo, CB_ADDSTRING, 0, (LPARAM)vertexStr.c_str());
            SendMessage(hEndVertexCombo, CB_ADDSTRING, 0, (LPARAM)vertexStr.c_str());
        }
 
    }
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
23.04.2018, 14:03
Так как использован стиль CBS_DROPDOWN, то всё, что вы выбрали в COMBO попадает из списка (LIST) в окно ввода (EDIT). Если вы вводите какие-то данные руками, то они попадают в поле ввода (EDIT). Для получения текущего значения вам нужно читать значение поля ввода (EDIT) из COMBO. Это делается функцией GetWindowText для COMBO, если вам эта функция чем-то не нравится и хочется всё делать через сообщения, то посылайте своему COMBO сообщение WM_GETTEXT.
Что вы пытаетесь сделать вызывая CB_SHOWDROPDOWN?
1
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
23.04.2018, 14:41  [ТС]
Ygg, а как сделать через CB_GETCURSEL?
я так сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hStartVertexCombo, CB_GETCURSEL, (WPARAM)TRUE, 0);
        return;
    }
    
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hEndVertexCombo, CB_GETCURSEL, (WPARAM)TRUE, 0);
        return;
    }
Добавлено через 1 минуту
Я не имею ничего против GetWindowText , но я не понял как с ней работать

Добавлено через 58 секунд
Например : у меня есть функция
C++
1
2
3
4
5
void FindPath(HWND hWnd)
{
    // и мне сюда нужно передавать что я выбрал , как это сделлать?
          auto findPath = findShortestPath(graph, /* сюда передавать с 1  окна индекс который я выбрад */ , /* сюда пердавать с втрого окна индекс*/ );
}
НО CB_GETCURSEL мне подходит. так как мне и нужно знать индекс. Но я так и не понял до конца. как мне и ее пердавать в мою функцию.
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
23.04.2018, 14:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindPath(HWND hWnd)
{
    int iStartVertex = (int)SendMessage(hStartVertexCombo, CB_GETCURSEL, 0, 0);
    int iEndVertex = (int)SendMessage(hEndVertexCombo, CB_GETCURSEL, 0, 0);
    if ((iStartVertex == CB_ERR) || (iEndVertex == CB_ERR))
    {
        // error msg...
        return;
    }
 
    // find...
}
Если вы в COMBO введёте ручками значение вершин отличные от того, что есть в списке будет ошибка.
Если вы в COMBO явно ничего не выберите, то будет ошибка.
Что бы не было возможности задать произвольное значение, а только выбор из списка, обычно используют стиль CBS_DROPDOWNLIST.
Что бы всегда было что-то выбрано, обычно сразу после заполнения списков принудительно выбирают начальные значения.
1
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
23.04.2018, 22:57  [ТС]
Ygg, если я Вас правильно понял, то тут всетаки так луче?
C++
1
2
3
4
5
6
7
8
9
10
11
if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hStartVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
    
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hEndVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
Что бы всегда было что-то выбрано, обычно сразу после заполнения списков принудительно выбирают начальные значения.
а как это сделать?

Добавлено через 7 минут
Я кину свой код где я использую комбобокс, чтобы знать что все я так как надо делаю:
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
hEndVertexStatic = CreateWindowW(L"Static", L"End Vertex:",
        WS_CHILD | WS_VISIBLE,
        695, 150, 80, 20,
        hWnd, (HMENU)ID_END_VERTEX_STATIC, 
        hInst, NULL);
 
    hEndVertexCombo = CreateWindowW(L"Combobox", NULL,
        WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
        770, 150, 120, 110, hWnd, NULL, 
        hInst, NULL);
................................
if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hStartVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
    
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hEndVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
 
    if (LOWORD(wParam) == ID_FIND_PATH_BUTTON)
    {
                /* тут я вызываю свою функцию*/
        FindPath(hWnd);
        return;
    }
 
    if (HIWORD(wParam) == ID_FILE_PATH_EDIT)
    {
                  /* тут  должен результат вывести моей функции FindPath*/
        SendMessage(hFoundPathEdit, CB_SHOWDROPDOWN, (WPARAM)TRUE, 0);
        return;
    }
.......................
for (const Vector& vertex : vertexBuffer)
        {
        ...........................................................................
 
            SendMessage(hStartVertexCombo, CB_ADDSTRING, 0, (LPARAM)vertexStr.c_str());
            SendMessage(hEndVertexCombo, CB_ADDSTRING, 0, (LPARAM)vertexStr.c_str());
        }
...................
void FindPath(HWND hWnd)
{
    int iStartVertex = (int)SendMessage(hStartVertexCombo, CB_GETCURSEL, 0, 0);
    int iEndVertex = (int)SendMessage(hEndVertexCombo, CB_GETCURSEL, 0, 0);
    
    auto findPath = findShortestPath(graph, iStartVertex, iEndVertex);
    Path vector = std::move(findPath.first);
    for (VertexIndex index = 0; index < vector.size(); ++index)
    {
        ...........................................................................
        SendMessage(hFoundPathEdit, WM_SETTEXT, 0, (LPARAM)vertexStr.c_str());
        //SetWindowText(hFoundPathEdit, vertexStr.c_str());
    }
}
Но где то я все таки делаю не так. не выводится ничего(

Добавлено через 3 часа 12 минут
Ygg,
поменял местами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (LOWORD(wParam) == ID_FIND_PATH_BUTTON)
    {
        FindPath(hWnd);
        return;
    }
 
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hStartVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
    
    if (HIWORD(wParam) == BN_CLICKED)
    {
        SendMessage(hEndVertexCombo, CBS_DROPDOWNLIST, (WPARAM)TRUE, 0);
        return;
    }
выводится толькео значения которое я зада в сомбобоксе справа. и хз почему)

Добавлено через 4 часа 39 минут
Ygg, такой вопрос, если я хочу изменить размер окна, запретить увеличивать.
C++
1
SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
где я должен это делать?
Где не поставлю, нигде не работает
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
23.04.2018, 23:37
Возможность изменения размера определяется стилем окна WS_SIZEBOX. Уберите этот стиль у окна при его создании и окно не будет растягиваться. Есть ещё сообщение WM_GETMINMAXINFO, если его ловить и обрабатывать в оконной функции, то с его помощью можно задать границы сжатия и растяжения окна.
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
23.04.2018, 23:49  [ТС]
У меня есть только:
C++
1
wcex.style = CS_HREDRAW | CS_VREDRAW;
WS_SIZEBOX нету

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
case WM_GETMINMAXINFO:
        {
            MINMAXINFO* mmi = (MINMAXINFO*)lParam;
            mmi->ptMaxSize.x = 600;
            mmi->ptMaxSize.y = 100;
            return 0;
        }
создал и не помогло
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
24.04.2018, 00:00
Вы путаете стиль класса и стиль окна, смотрите стили окна при вызове функции CreateWindow.
Для WM_GETMINMAXINFO укажите ptMaxTrackSize.
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.04.2018, 12:21  [ТС]
Ygg, спасибо. а как сделать чтобы Edit был ReadOnly?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
24.04.2018, 12:44
При создании EDIT добавьте к стилям окна ES_READONLY.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
24.04.2018, 12:45
Цитата Сообщение от dimaSlon Посмотреть сообщение
а как сделать чтобы Edit был ReadOnly?
Вы удивитесь, но это дает стиль ES_READONLY
1
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.04.2018, 15:01  [ТС]
liv, а чтобы кнопка была не активная в некоторых случаях?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
24.04.2018, 15:04
dimaSlon, EnableWindow Вам в помощь
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.04.2018, 15:15  [ТС]
liv, а где мне делать
C++
1
EnableWindow(hFilePathEdit, 0);
чтобы была не активная кнопка? Я делаю в wWinMain. Но она активная всеравно.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
24.04.2018, 15:19
Во-первых, чтобы была неактивной, надо:
C++
1
EnableWindow(hFilePathEdit, 0);
Где делать? В любых местах, где надо.
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.04.2018, 15:26  [ТС]
liv, у меня 0 там. то я не там скопировал. Мне нужно чтобы при запуску програмы кнопка была не активная. а активную я знаю где делать.....

Добавлено через 1 минуту
все я разобрался)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2018, 15:26
Помогаю со студенческими работами здесь

Нужен Ваш совет
Ребята,нужен совет.Есть лабораторные работы(методичка прикреплена) и я хочу послушать ваши предложение о том, на каком языке...

Нужен ваш совет
Ребята, помогите мне решить номер, в VBA совсем недавно, не могу решить задание: САМА ЗАДАЧА --- Удалить во всех словах букву «а»,...

Нужен ваш совет
Ребят, почему не выходит елочка? var num = 4; var a = ; var b = ; var ce = a.push('*'); var d = b.pop(); for(var i = 1;i &lt;=...

Нужен совет ваш.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,...

нужен ваш совет!
господа,помогите плиз Печать таблиц операций сложения и умножения для троичных чисел. таблица сложения имеет вид: + 0 1 2 0 0 1 2 ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru