Программно изменить поле со списком

Мне нужно обновить combobox новым значением, чтобы он изменил отраженный в нем текст. Самый простой способ сделать это — после инициализации combobox с сообщением.

Итак, я пытаюсь создать postmessage для hwnd, содержащего combobox.

Итак, если я хочу отправить ему сообщение, изменив текущий выбранный элемент на n-й элемент, как будет выглядеть postmessage?

Я предполагаю, что это будет связано с ON_CBN_SELCHANGE, но я не могу заставить его работать правильно.


person graham.reeds    schedule 12.09.2008    source источник
comment
Есть ли язык, в котором вы ищете пример? С++?   -  person GEOCHET    schedule 12.09.2008
comment
Подсказка в теге MFC :)   -  person Mark Ingram    schedule 12.09.2008


Ответы (4)


Вы хотите ComboBox_SetCurSel:

ComboBox_SetCurSel(hWndCombo, n);

или если это элемент управления MFC CComboBox, вы, вероятно, можете сделать:

m_combo.SetCurSel(2);

Я полагаю, что если вы делаете это вручную, вам также понадобится SendMessage, а не PostMessage. CBN_SELCHANGE — это уведомление, которое элемент управления отправляет обратно вам при изменении выбора.

Наконец, вы можете добавить к этому вопросу тег c++.

person Simon Steele    schedule 12.09.2008

Краткая версия:

const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
person Mark Ingram    schedule 12.09.2008

Что может пойти не так, так это то, что выбор изменяется внутри обработчика сообщения об изменении выбора, что приводит к другому сообщению об изменении выбора.

Один из способов обойти этот нежелательный цикл обратной связи — добавить часовой механизм в обработчик сообщения об изменении выбора, как показано ниже:

void onSelectChangeHandler(HWND hwnd)
{
  static bool fInsideSelectChange = 0;

  //-- ignore the change message if this function generated it
  if (fInsideSelectChange == 0)
  {
    //-- turn on the sentinel
    fInsideSelectChange = 1;

    //-- make the selection changes as required
    .....

    //-- we are done so turn off the sentinel
    fInsideSelectChange = 0;
  }
}
person jussij    schedule 19.09.2008

если вы хотите изменить заголовок - это строка, отображаемая при закрытии поля со списком, вы можете сделать следующее:

m_ComboBox.DeleteString(0); // сначала удалить предыдущую, если она есть, 0 = визуальная строка m_ComboBox.AddString(_T("Привет"));

поместите это в fx. в OnCloseupCombo - при закрытии события срабатывает раскрывающийся список

ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)

Это изменение представляет собой новую строку, а не выбор уже назначенных элементов списка.

person serup    schedule 21.07.2017
comment
Я был бы признателен за комментарий, когда меня проголосовали, иначе я не могу воспринимать это всерьез - person serup; 25.07.2017