Cambiar programáticamente el cuadro combinado
-
09-06-2019 - |
Pregunta
necesito actualizar un combobox
con un nuevo valor por lo que cambia el texto reflejado en él.La forma más limpia de hacerlo es después de combobox
ha sido inicializado y con un mensaje.
Entonces estoy tratando de crear un postmessage
al hwnd que contiene el combobox
.
Entonces, si quiero enviarle un mensaje, cambiando el elemento actualmente seleccionado al enésimo elemento, ¿cuál sería el postmessage
¿parece?
Supongo que implicaría ON_CBN_SELCHANGE
, pero no consigo que funcione correctamente.
Solución
Quieres ComboBox_SetCurSel:
ComboBox_SetCurSel(hWndCombo, n);
o si es un control MFC CComboBox probablemente puedas hacer:
m_combo.SetCurSel(2);
Me imagino que si lo haces manualmente también querrás SendMessage en lugar de PostMessage.CBN_SELCHANGE es la notificación que envía el control de nuevo a usted cuando se cambia la selección.
Finalmente, es posible que desees agregar la etiqueta c++ a esta pregunta.
Otros consejos
Una versión concisa:
const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
Lo que podría estar yendo mal es que la selección se está cambiando dentro del controlador de mensajes de cambio de selección, lo que da como resultado otro mensaje de cambio de selección.
Una forma de solucionar esto bucle de retroalimentación no deseado es agregar un centinela al controlador de mensajes de cambio de selección como se muestra a continuación:
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;
}
}
Si desea cambiar el título, que es la línea que se muestra cuando se cierra el cuadro combinado, puede hacer lo siguiente:
m_ComboBox.DeleteString(0);// primero eliminar anterior si alguno, 0 = Visual String m_comboBoBox.addString (_t ("Hola"));
pon esto en fx.en OnCloseupCombo: cuando el evento se cierra, se activa un cuadro desplegable
ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)
Este cambio es una nueva cadena, no una selección de elementos del cuadro combinado ya asignados.