Domanda

Ho una classe CListCtrl e nel momento in cui un utente seleziona una delle voci secondarie che sto visualizzando un CComboBox sulla sottovoce, che l'utente può quindi effettuare una selezione da.

Comunque ho un problema. Quando l'utente ha selezionato devo casella combinata a scomparire (cioè intercetta CBN_SELCHANGE). Il problema è che ho bisogno di fare il CComboBox un figlio del CListCtrl (In caso contrario ottengo strani problemi con l'elenco dei disegni sulla casella combinata, anche se ho impostato la casella combinata di essere più in alto). Quindi il messaggio viene inviato CBN_SELCHANGE alla visualizzazione lista che, comprensibilmente, ignora. Come posso ottenere la visualizzazione elenco per passare quel messaggio fino alla finestra di padre.

Ho davvero bisogno di derivare la mia stessa classe CListCtrl che intercetta semplicemente il messaggio CBN_SELCHANGE e lo passa alla finestra genitore? C'è un modo migliore per fare questo che la creazione di un gestore OnWndMsg?

Grazie per qualsiasi aiuto!

Edit: Questo codice funziona

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()
    {
    };
};

ma mi piacerebbe davvero sapere se c'è un modo migliore per farlo.

È stato utile?

Soluzione

È possibile sottoclasse CComboBox tale che gestirà il messaggio CBN_CLOSEUP. Il tuo Combo personalizzato sapere il manager vale a dire l'oggetto che lo ha creato, in primo luogo e dovrà distruggerlo sul primo piano (finestra in primo piano o qualsiasi altra cosa, dovrebbe essere fornito come argomento al costruttore di combobox personalizzato) ... Così, quando si crea combobox su una parte superiore della voce di elenco si crea un'istanza di questa combobox personalizzato invece di quello predefinito MFC uno. gestore di eventi Combobox potrebbe apparire così:

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top