Changer la liste déroulante par programme
-
09-06-2019 - |
Question
J'ai besoin de mettre à jour un combobox
avec une nouvelle valeur afin de modifier le texte réfléchi.La façon la plus propre de procéder est après le combobox
a été initialisé et avec un message.
J'essaie donc 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é par le nième élément, quel serait le postmessage
ressembler?
Je suppose que cela impliquerait ON_CBN_SELCHANGE
, mais je n'arrive pas à le faire fonctionner correctement.
La solution
Tu veux ComboBox_SetCurSel:
ComboBox_SetCurSel(hWndCombo, n);
ou s'il s'agit d'un contrôle MFC CComboBox, vous pouvez probablement le faire :
m_combo.SetCurSel(2);
J'imagine que si vous le faites manuellement, vous voudriez également SendMessage plutôt que PostMessage.CBN_SELCHANGE est la notification que le contrôle envoie je reviens à toi lorsque la sélection est modifiée.
Enfin, vous souhaiterez peut-être ajouter la balise c++ à cette question.
Autres conseils
Une version concise :
const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);
Ce qui pourrait ne pas fonctionner, c'est que la sélection est modifiée dans le gestionnaire de messages de changement de sélection, ce qui entraîne un autre message de changement de sélection.
Une façon de contourner ce problème boucle de rétroaction indésirable consiste à ajouter une sentinelle au gestionnaire de messages de modification de sélection, 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;
}
}
si vous souhaitez modifier le titre - qui est la ligne affichée lorsque la liste déroulante est fermée, vous pouvez procéder comme suit :
m_ComboBox.DeleteString(0);// Supprimer d'abord le cas échéant, 0 = chaîne visuelle m_combobox.addString (_t ("bonjour"));
mets ça dans FX.dans OnCloseupCombo - lorsque l'événement se ferme, une liste déroulante se déclenche
ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)
Ce changement est une nouvelle chaîne et non une sélection d'éléments combobox déjà attribués