c++ winapi mfc combobox postmessage

c++ - Cambiar el cuadro combinado de forma programática



winapi mfc (4)

Necesito actualizar un combobox con un nuevo valor para que cambie el texto reflejado en él. La forma más limpia de hacer esto es después de que el combobox se haya inicializado y con un mensaje.

Por lo tanto, estoy tratando de crear un postmessage al hwnd que contiene el combobox .

Entonces, si quiero enviarle un mensaje, cambiando el elemento seleccionado actualmente al n-ésimo elemento, ¿cómo se vería el postmessage ?

Supongo que implicaría ON_CBN_SELCHANGE , pero no puedo hacerlo funcionar correctamente.


Desea ComboBox_SetCurSel :

ComboBox_SetCurSel(hWndCombo, n);

o si se trata de un control CComboBox de MFC, probablemente puedas:

m_combo.SetCurSel(2);

Me imagino que si lo haces manualmente también querrías SendMessage en lugar de PostMessage. CBN_SELCHANGE es la notificación que el control le devuelve cuando se cambia la selección.

Finalmente, es posible que desee agregar la etiqueta c ++ a esta pregunta.


Una versión concisa:

const int index = 0; m_comboBox.PostMessage(CBN_SELCHANGE, index);


Lo que podría estar fallando 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 evitar este ciclo de retroalimentación no deseado es agregar un centinela al manejador de mensajes de selección de cambios 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 elimine el anterior si lo hay, 0 = cadena visual m_ComboBox.AddString (_T ("Hola)");

poner esto en fx. en OnCloseupCombo - cuando el evento cierra un cuadro desplegable dispara

ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)

Este cambio es una nueva cadena, no una selección de elementos combobox ya asignados