Программно изменить комбинированный список - PullRequest
2 голосов
/ 12 сентября 2008

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 12 сентября 2008

Вы хотите ComboBox_SetCurSel :

ComboBox_SetCurSel(hWndCombo, n);

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

m_combo.SetCurSel(2);

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

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

1 голос
/ 12 сентября 2008

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

const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
0 голосов
/ 21 июля 2017

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

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

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

ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)

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

0 голосов
/ 19 сентября 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;
  }
}
...