Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ComboBox - получить индекс элемента  (Прочитано 25335 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vofka
Гость
« : 05-12-2005 15:53 » 

Люди, помогите пожалуйста! Ну никак не могу приделать combobox к диалогу. Вернее так: сам комбобокс вставил, добавил элементы через CB_ADDSTRING, а как теперь получить индекс элемента? Какое событие должно обрабатываться при выборе элемента комбобокса? CBN_DBLCLK тут не приделаешь - элемент-то выбирается одним кликом...  Жаль Может я не понимаю чего?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-12-2005 10:09 » 

обрабатывать CBN_SELCHANGE,

индекс:

Код:
CComboBox* cbx=0;
cbx=(CComboBox*)(GetDlgItem( ID ));
if(!cbx)
{
//ошибка
//return;
}

int index=cbx->GetCurSel();

if(index<0)
{
//ошибка
//return;
}

ID - ИД комбы
(можно, кстати, в обработчике достать так: )

Код:
CButton* cbx=(CComboBox*)GetDlgItem(GetCurrentMessage()->wParam);
if(!cbx)
{
//ошибка
//return;
}

int index=cbx->GetCurSel();

if(index<0)
{
//ошибка
//return;
}

« Последнее редактирование: 06-12-2005 10:12 от Алексей1153 » Записан

Vofka
Гость
« Ответ #2 : 06-12-2005 13:49 » 

У меня обработчик combobox'а вот так реализован:

Код:
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDC_COMBO1:
if(HIWORD(wParam)==CBN_SELCHANGE)
sf.ParamSpaceSymb = SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
return 1;
Все хорошо, только в переменную ничего не передается Жаль Хотя на брекпойнте вываливается исправно, т.е. событие видит, но переменная как была с нулем, так и осталась...
« Последнее редактирование: 04-12-2007 20:26 от Алексей1153++ » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 06-12-2005 15:25 » 

Vofka,

вот пример (на диалоге у тебя должен быть элемент с ид=IDC_COMBO1):

Код:

void CCombo::OnSelchangeCombo1()
{
CString strCombo;
    int nSel = 0, nItemData = 0;

CComboBox * pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);

    // get selection index
    nSel = pCombo->GetCurSel();
    // get selected text
    pCombo->GetLBText(nSel, strCombo);
    // show this text
    GetDlgItem(IDC_STATIC_COMBO)->SetWindowText(strCombo);
// get item data (is unique value for each item in the combo box)
nItemData = pCombo->GetItemData(nSel);
}

BOOL CCombo::OnInitDialog()
{
CDialog::OnInitDialog();

    // set values
    CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    if (pCombo)
    {
        pCombo->AddString("test1");
pCombo->SetItemData(0, 10);

        pCombo->AddString("test2");
pCombo->SetItemData(1, 20);

        pCombo->AddString("test3");
pCombo->SetItemData(2, 30);

        pCombo->SetCurSel(0);
    }
return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}


что неясно-спрашивай.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 06-12-2005 17:43 » 

Народ, Vofka на АПИ пишет. Вы его МФЦ убьете Улыбаюсь.
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 07-12-2005 05:27 » 

пусть переходит Улыбаюсь

ЗЫ всё переводится
Записан

Vofka
Гость
« Ответ #6 : 07-12-2005 08:00 » 

Друзья, nikedeforest абсолютно прав - проект полностью на API, переписывать его на MFC заново - дубу даться (программа уже готова, я только вношу в нее изменения и добавления). Огромная благодарность и Алексею1153, и Malaja, но может кто-то сможет подсказать, как реализовать combobox только на API?   Так больше нельзя... Люди добрые, помогите, кто чем может  Молчу
Записан
Vofka
Гость
« Ответ #7 : 07-12-2005 13:07 » 

Уф! Спасибо всем - разобрался!  Целую  Отлично Проблема была в двух местах:
Код:
case IDC_COMBO1:
if(HIWORD(wParam)==CBN_SELCHANGE)
{hwndComboBox = GetDlgItem(hDlg, IDC_COMBO1);
sf.ParamSpaceSymb = SendMessage(hwndComboBox, CB_GETCURSEL, 0, 0);}
return 1;

А главная проблема была вообще в другом месте - в отображение текущего выбора: я написал так:
Код:
SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, 0,"текст№1");
а нужно было:
Код:
SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, sf.ParamSpaceSymb, 0);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 19-01-2009 10:16 » 

(вопрос снова по комбе, поэтому тут)

не могу понять, как программно свернуть и развернуть выпадающий список. Вот это не работает
Код:
::SendMessage(m_comboH,CB_SHOWDROPDOWN,(WPARAM)0,(LPARAM)0);//свернуть

а больше ничего похожего не нашёл. Также не помогает даже
::SetFocus(0);

хотя, если фокус перемещён мышкой, то список сворачивается
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 19-01-2009 10:43 » 

А m_comboH это у тебя чего?

Если объект, то лучше делай так

   m_cmb1.SendMessage(CB_SHOWDROPDOWN, (WPARAM)TRUE,(LPARAM)0);
   Sleep(3000);
   m_cmb1.SendMessage(CB_SHOWDROPDOWN, (WPARAM)FALSE,(LPARAM)0);

в крайнем случае так:

   ::SendMessage(m_cmb1.GetSafeHwnd(), CB_SHOWDROPDOWN, (WPARAM)TRUE,(LPARAM)0);
   Sleep(3000);
   ::SendMessage(m_cmb1.GetSafeHwnd(), CB_SHOWDROPDOWN, (WPARAM)FALSE,(LPARAM)0);


Всё работает
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 19-01-2009 12:34 » 

неа, не работает Улыбаюсь Не вижу реакции вообще
   ::SendMessage(pcbx->GetSafeHwnd(), CB_SHOWDROPDOWN, (WPARAM)1,(LPARAM)0);
   ::SendMessage(pcbx->GetSafeHwnd(), CB_SHOWDROPDOWN, (WPARAM)0,(LPARAM)0);

слип, кстати, тут ни при чём

А может это изза того, что элемент расположен на тулбаре ?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 19-01-2009 13:18 » 

Я этот слип встроил чтобы посмотреть программное закрытие. А иначе он закрывается по KillFocus.  Что, съел?

Попробуй тоже самое на диалоге и ищи проблему в другом месте.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 19-01-2009 18:30 » 

хм, странно, щас попробовал, работает. Завтра на работе буду разбираться, что там у меня не так
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines