Question

J'ai une classe CListCtrl et au moment où un utilisateur sélectionne l'un des sous-éléments que je suis un CComboBox sur l'affichage du sous-élément que l'utilisateur peut alors effectuer une sélection à partir.

Cependant, j'ai un problème. Lorsque l'utilisateur a fait une sélection i besoin de la zone de liste déroulante à disparaître (c.-à-interception CBN_SELCHANGE). Le problème est que je dois faire le CComboBox un enfant du CListCtrl (Sinon je des problèmes bizarres avec la liste de dessin sur la zone de liste déroulante, même si je mets la zone de liste déroulante pour être supérieure). Donc, le message est envoyé CBN_SELCHANGE à la vue de la liste qui, naturellement, l'ignore. Comment puis-je obtenir la vue de la liste pour transmettre ce message à la fenêtre parent.

Ai-je vraiment besoin de tirer ma propre classe CListCtrl qui intercepte simplement le message CBN_SELCHANGE et le transmet à la fenêtre parent? Y at-il une meilleure façon de le faire que de créer un gestionnaire OnWndMsg?

Merci pour toute aide!

Edit: Ce code fonctionne

class CPassThroughListCtrl : public CListCtrl
{
protected:
    virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        if ( message == WM_COMMAND )
        {
            GetParent()->SendMessage( message, wParam, lParam );
        }
        return CListCtrl::OnWndMsg( message, wParam, lParam, pResult );
    }
public:
    CPassThroughListCtrl()
    {
    };
};

Mais je voudrais vraiment savoir s'il y a une plus belle façon de le faire.

Était-ce utile?

La solution

Vous pouvez sous-classe CComboBox telle qu'elle traitera un message CBN_CLOSEUP. Votre Combo personnalisé saura sur le gestionnaire à savoir l'objet qui l'a créé en premier lieu et devra détruire sur gros plan (fenêtre de niveau supérieur ou autre, devrait être fourni comme argument à votre constructeur combobox personnalisé) ... Donc, lorsque vous créez combobox sur un haut de l'élément de liste vous créer une instance de cette combobox personnalisée au lieu de la valeur par défaut MFC un. gestionnaire d'événements ComboBox pourrait ressembler à ça:

BEGIN_MESSAGE_MAP(CNotifyingComboBox, CComboBox)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
END_MESSAGE_MAP()

void CNotifyingComboBox::OnCloseUp()
{
    // _manager is pointer to the object that created this combobox, 
    // and is responsible for its destruction, 
    // should be passed into CNotifyingComboBox cosntructor
    if( NULL != _manager )
    {
        _manager->OnCloseUpComboBox(this);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top