2008-09-12 25 views
2

Je dois mettre à jour un combobox avec une nouvelle valeur afin qu'il modifie le texte reflété. La manière la plus propre de le faire est après que le combobox a été initialisé et avec un message.Modification de la liste modifiable par programme

Donc j'essaye de créer un postmessage au hwnd qui contient le combobox. Donc, si je veux lui envoyer un message en changeant l'élément actuellement sélectionné au nième élément, à quoi ressemblerait le postmessage?

Je suppose que cela impliquerait ON_CBN_SELCHANGE, mais je ne peux pas le faire fonctionner correctement.

+0

Y at-il une langue en particulier que vous cherchez un exemple? C++? – GEOCHET

+0

L'indice est dans l'étiquette MFC :) –

Répondre

8

Vous voulez ComboBox_SetCurSel:

ComboBox_SetCurSel(hWndCombo, n); 

ou si elle est un contrôle MFC CComboBox vous pouvez probablement faire:

m_combo.SetCurSel(2); 

j'imagine si vous le faites vous manuellement aussi vouloir SendMessage plutôt que PostMessage. CBN_SELCHANGE est la notification que le contrôle envoie de nouveau à vous lorsque la sélection est modifiée.

Enfin, vous pouvez ajouter la balise C++ à cette question.

1

Une version concise:

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

Ce qui pourrait aller mal est la sélection est changé à l'intérieur du changement de sélection gestionnaire de messages, ce qui entraîne dans un autre message de changement de sélection.

Une façon de contourner cette boucle de rétroaction indésirable est d'ajouter une sentinelle au sélectionnez le gestionnaire de messages de changement comme indiqué ci-dessous:

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; 
    } 
} 
-1

si vous Fx voulez changer le titre - qui est la ligne s'affiche lorsque la zone de liste déroulante est fermée, vous pouvez procéder comme suit:

m_ComboBox.DeleteString (0); // supprime tout d'abord le cas échéant, 0 = chaîne visuelle m_ComboBox.AddString (_T ("Hello there"));

mettez cela en fx. dans OnCloseupCombo - lorsque l'événement fermer un feu de dropdownbox

ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo) 

Ce changement est une nouvelle chaîne pas une sélection d'éléments combobox déjà attribués

+0

J'apprécierais un commentaire quand je suis rejeté, sinon je ne peux pas le prendre au sérieux – serup