Alterar programaticamente caixa de combinação
-
09-06-2019 - |
Pergunta
Eu preciso atualizar um combobox
com um novo valor de forma a que as alterações refletidas texto.A maneira mais para fazer isso é depois que o combobox
tem sido inicializado e com uma mensagem.
Então, eu estou tentando criar uma postmessage
para o hwnd que contém o combobox
.
Portanto, se eu quiser enviar uma mensagem a ele, alterar o item atualmente selecionado para o n-ésimo item, que seria o postmessage
se parece?
Eu estou supondo que isso envolveria ON_CBN_SELCHANGE
, mas eu não posso fazê-lo funcionar direito.
Solução
Você quer ComboBox_SetCurSel:
ComboBox_SetCurSel(hWndCombo, n);
ou se for um MFC CComboBox controle, você pode provavelmente fazer:
m_combo.SetCurSel(2);
Eu imagino se você está fazendo isso manualmente, você também quer SendMessage, ao invés de incluir PostMessage.CBN_SELCHANGE é a notificação de que o controle envia de volta para você quando a selecção é alterada.
Finalmente, você pode querer adicionar o c++ tag para esta pergunta.
Outras dicas
Uma versão concisa:
const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
O que pode estar acontecendo de errado é a seleção está sendo alterado dentro da seleção alterar o manipulador de mensagem, que resultam em uma outra seleção de alterar a mensagem.
Uma forma de contornar esta indesejados de feedback loop é para adicionar uma sentinela para a escolha alterar manipulador de mensagem como mostrado abaixo:
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;
}
}
se você fx deseja alterar o título - que é a linha mostrada quando a caixa de combinação está fechado, então você pode fazer o seguinte:
m_ComboBox.DeleteString(0);// primeiro excluir anteriores, se houver, 0 = visual cadeia m_ComboBox.AddString(_T("Olá"));
coloque isso no fx.em OnCloseupCombo - quando o evento de fechar um dropdownbox incêndios
ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)
Esta mudança é uma nova seqüência de caracteres não uma seleção dos já atribuídos a caixa de combinação de elementos