Программно изменить поле со списком
-
09-06-2019 - |
Вопрос
мне нужно обновить combobox
с новым значением, чтобы изменить отраженный в нем текст.Самый чистый способ сделать это — после combobox
был инициализирован и с сообщением.
Поэтому я пытаюсь создать postmessage
к hwnd, содержащему combobox
.
Итак, если я хочу отправить ему сообщение, изменив текущий выбранный элемент на n-й элемент, что будет postmessage
выглядит как?
Я предполагаю, что это потребует ON_CBN_SELCHANGE
, но я не могу заставить его работать правильно.
Решение
Вы хотите ComboBox_SetCurSel:
ComboBox_SetCurSel(hWndCombo, n);
или, если это элемент управления MFC CComboBox, вы, вероятно, можете сделать:
m_combo.SetCurSel(2);
Я предполагаю, что если вы делаете это вручную, вам также понадобится SendMessage, а не PostMessage.CBN_SELCHANGE — это уведомление, которое отправляет элемент управления. обратно к тебе когда выбор будет изменен.
Наконец, вы можете добавить к этому вопросу тег c++.
Другие советы
Краткая версия:
const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
Что может пойти не так, так это то, что выбор изменяется внутри обработчика сообщения об изменении выбора, что приводит к появлению другого сообщения об изменении выбора.
Один из способов обойти это нежелательная петля обратной связи заключается в добавлении дозорного в обработчик сообщения об изменении выбора, как показано ниже:
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;
}
}
если вы хотите изменить заголовок — строку, отображаемую при закрытии поля со списком, вы можете сделать следующее:
m_ComboBox.DeleteString(0);// сначала удалить предыдущее, если есть, 0 = Visual String M_Combobox.AddString (_t ("Привет там"));
поместите это в FX.в OnCloseupCombo - при закрытии события срабатывает раскрывающийся список
ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)
Это изменение представляет собой новую строку, а не выбор уже назначенных элементов поля со списком.