Frage

Ich habe eine CListCtrl Klasse und im Moment, wenn ein Benutzer wählt einen der Unterpunkte ich eine CComboBox über die subitem am anzeigt, die der Benutzer dann aus eine Auswahl treffen können.

Allerdings habe ich ein Problem. Wenn der Benutzer eine Auswahl getroffen hat muss ich das Kombinationsfeld (CBN_SELCHANGE dh Intercept) verschwinden. Das Problem ist, dass ich die CComboBox ein Kind des CListCtrl machen müssen (Sonst ich seltsame Probleme mit der Liste bekommen Zeichnung über die Combo-Box, auch wenn ich das Kombinationsfeld gesetzt oberste zu sein). So wird die CBN_SELCHANGE Nachricht in die Listenansicht gesendet, die verständlicherweise ignoriert. Wie kann ich die Liste Ansicht, dass die Nachricht an das übergeordnete Fenster zu verzichten.

Muss ich meine eigene CListCtrl Klasse müssen abzuleiten, die einfach wirklich fängt den CBN_SELCHANGE Nachricht und übergibt sie an das übergeordnete Fenster nach oben? Gibt es einen besseren Weg, dies zu tun, als einen OnWndMsg Handler erstellen?

Vielen Dank für jede Hilfe!

Edit: Dieser Code funktioniert

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

Aber ich würde wirklich gerne wissen, ob es eine schönere Art und Weise, dies zu tun.

War es hilfreich?

Lösung

Sie können die Unterklasse CComboBox, so dass es CBN_CLOSEUP Nachricht behandelt. Ihre individuelle Combo weiß über die Manager das heißt das Objekt, das es in erster Linie erstellt und zerstört hat, um es auf Abschluss oben (Top-Level-Fenster oder was auch immer, soll als Argument für Ihren benutzerdefinierte Combobox Konstruktor zur Verfügung gestellt werden) ... Also, wenn Sie combobox auf einem oberen Rand des Listenelement erstellen werden Sie Instanz dieser maßgeschneiderten Combobox anstelle der MFC Standard erstellen. Combobox Ereignishandler wie das aussehen könnte:

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top