Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение Combobox'a 
:(
    Опции темы
rainbow86
Дата 5.11.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Подскажите с помощью какой функции заполняется drop-down лист сombobox'a
Нашел только SendMessage(CB_ADDSTRING), может чего-то есть поудобней???
smile
PM MAIL   Вверх
GremlinProg
Дата 6.11.2005, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



есть ещё CB_INSERTSTRING, но эт почти тож самое, не пойму, чем неудобно-то?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Fixin
Дата 9.11.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



В <windowsx.h> есть макросы, кторые "удобняют" работу со стандартными элементами управления.
Добавлено @ 21:02
Вот:
Код
ComboBox_AddString(hComboBox, "Hello, World!");

PM MAIL ICQ   Вверх
AntoshaMarchenko
Дата 22.5.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Простите, за ламерство, никак не могу добавить в комбо-бокс строку. Комбобокс находится в диалоговом окне.
(win 32, VisualStudio)
оконная процедура диалога :
Код

BOOL CALLBACK Dlg_Presets_Proc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch (iMsg)
    {
        case WM_INITDIALOG:
        {
            char ch1[]="ASDF" ;
            char ch2[]="WSX" ;
            SendDlgItemMessage( hDlg, IDC_COMBO1, CB_RESETCONTENT, 0, 0) ;
            SendDlgItemMessage( hDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)ch1) ;
            SendDlgItemMessage( hDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)ch2) ;
            break ;
        }
...

С лист боксом всё работает нормально. А в комбобобкс ничего не добавляется, хоть тресни. 
Подскажите плиз, что делать.

Пробовал через SendMessage, ничё не получается.
Код

hwndCombo = GetDlgItem( hDlg, IDC_COMBO1)  ;
SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)ch1) ;

на вас уповаю 
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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

Еще проверь 2 вещи:
1) IDC_COMBO1 действительно ид-р твоего комбобокса. Спаем посмотри.
2) А вдруг у тебя комбобокс OwnerDraw? На всякий случай...

 


--------------------
...
PM   Вверх
AntoshaMarchenko
Дата 22.5.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Пасиба. 
к сожалению от этого не легче

СендМеседж возвращает всё как надо.
IDC_COMBO1 - правильный АйПи, я через него комбо бокс открывал (но ни одного элемента в нём не было).
Нет, не OwnerDraw

Может быть в какой-нить параметре диалогового окна проблема? 
 

Это сообщение отредактировал(а) AntoshaMarchenko - 22.5.2006, 22:02
PM MAIL   Вверх
AntoshaMarchenko
Дата 22.5.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Выяснился такой момент:
Строки добавлять всё же получается, но они просто не отображаются. 
Добавляю значит в комбо-бокс четыре строки. Если одну из них выделить програмно (посредством CB_SETCURSEL), то она будет отображаться, но остальные - нет. 
И даже можно, выделив комбо-бокс, пролистывать строки стрелками клавиатуры. 
Тоесть получается отображается только выделенная строка.
Но почему остальные строки не выпадают то ????????? (список выпадает, но в нём одна строка, которая была выделена)

подскажите плизз 
PM MAIL   Вверх
GremlinProg
Дата 22.5.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Комбобокс - штука опасная, это в MFC или WTL мы просто добавляем строки, а здесь нужно еще следить за вываливающимся списком. В твоем случае у списка просто стоит нулевая длина. После добавления строк выстави её к примеру на 100.

Добавлено @ 23:07 
под длиной, я имел ввиду высоту ) 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
AntoshaMarchenko
Дата 23.5.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



А я кстати пробовал, но ничего не получилось  smile 
Код

SendDlgItemMessage( hwnd, IDC_COMBO1, CB_SETMINVISIBLE, (WPARAM)20, 0) ;


Выдаёт: "CB_SETMINVISIBLE" undeclares identifier
То что в мсдн было написано, я ессно инклюдил (Commctrl.h) 
Безрезультатно.

А ещё пишут:
Цитата

To use CB_SETMINVISIBLE, the application must specify comctl32.dll version 6 in the manifest

Простите за дремучесть, я не сильно понял, чё за манифест такой. Вписал на всякий случай в линкер - инпут, но естессна безтолку, компилятор то просто константу найти не может.

во всём мсдне примеров с этой командой нет, хоть плачь.

чё делать то, подскажите. 
PM MAIL   Вверх
Earnest
Дата 23.5.2006, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Все с тобой ясно.

Комбобокс у тебя в ресурсах диалога? Тогда сходи туда, кликни на кнопку, и растяни как надо появившийся прямоугольник.
Если создаешь динамически, то можно выставить высоту и явно, но ты не то сообщение используешь. К сожалению, сейчас MSDN нет под рукой посмотреть, но там должно быть что-то про height: SETDROPDOWNHEIGHT - как-то так. Просмотри все сообщения CB_, наверняка найдешь.
Про манифест забудь, не имеет отношения к вопросу.

Кстати, такий вопрос регулярно задается на форуме, только чаще в MFC-разделе. Почему-то многие на эти грабли наступают smile  


--------------------
...
PM   Вверх
GremlinProg
Дата 23.5.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



програмно размер любого окна задается с помощью единственной функции SetWindowPos, а не CB_SETMINVISIBLE. Чтобы получиь дескриптор окна списка нужно использовать GetComboBoxInfo или посылкой сообщения CB_GETCOMBOBOXINFO, что и делает GetComboBoxInfo. Для диалога достаточно будет сделать так, как сказала Earnest 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 23.5.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да, точно, для установки высоты сообщения нет, это я с шириной перепутала, извиняюсь. Нужно выставлять размер окна. 
Но проблема в том, что CB_GETCOMBOBOXINFO доступно только в XP. А в других версиях хандл списка приходится добывать всякими извращенными способами - через ловлю CTLCOLOR, например.
Но по-моему, когда говоришь MoveWindow (или SetWindowPos) самой комбе, она высоту воспринимает именно как высоту вместе со списком. Хотя не уверена... 


--------------------
...
PM   Вверх
GremlinProg
Дата 23.5.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



CB_GETCOMBOBOXINFO - это правильный и логичный вариант, Delphi решила эту проблему универсально: GW_CHILD вам ни что не напоминает, за что хвала Bornand'у он это продумал намного раньше, чем появилась XP. Комбо - компонент в обычном смысле, состоящий из поля с кнопкой, в расширенном смысле - состоящий из поля с кнопкой, едитом и списком-POPUP. В общем, читайте борланд, с комбо он тему рулит уже с первой версии, а я уважаю старших, MFC вроде тоже, не помню... 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 24.5.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да никто не спорит, что
Цитата(GremlinProg @  23.5.2006,  23:28 Найти цитируемый пост)
CB_GETCOMBOBOXINFO - это правильный и логичный вариант
. Если он есть. А есть он только начиная с XP. Если кому-то это не важно - флаг в руки. Но приходится и 98 поддерживать... Ну или как минимум 2000...
А выпадающий список не является потомком комбы, увы, он потомок desktop'а, не найдешь его, идя от комбы. Способ с CTLCOLOR я ведь не сама придумала, это от микрософтовских экспертов совет... Не факт, кстати, что борланд родной MS комбо использует. Изначально это жутко кривая вещь, наверное, код еще с 3.1 перенесли as is...

Но, похоже, автора по вопросу длины выпадающего списка мы удовлетворили...
Вот только молчит что-то...  smile  


--------------------
...
PM   Вверх
GremlinProg
Дата 24.5.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Да я тоже не спорю, но CTLCOLOR не использую, просто говорю, что еще до XP эта проблема решалась с помощью GetWindow(hwnd,GW_CHILD) у Борланда. В любом случае - это уже другая тема. Я не говорю, что список - потомок комбы (комбо в смысле комбобокс?), это даже просто проверить: GetClassName. Эдит - это простой EDIT, а список - это ComboLBox, описание которого недокументировано. Ясно только одно: он порожден от LISTBOX'а. Причем едита не будет вообще, если комбобокс - фиксированный, значение просто будет рисоваться на месте едита. С попап списками я некоторое время разбирался и делал всплывающие контролы, дабы пустить пыль в глаза ), правда это не так просто как кажется. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1199 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.