Bestimmen des angeklickten Items einer List-View Control



  • Ich schreibe gerade mein erstes Programm mithilfe der MFC, also ist die folgende Frage wahrscheinlich eher auf Basisniveau. Trotzdem:

    Ich benutze eine von CListCtrl abgeleitete Klasse, um ein List-View Control zu verwalten. Ich möchte nun irgendwie rausbekommen, wenn und vor allem welches Element der User angeklickt hat. Ich benutze Visual C++ 2005. Soweit ich bis jetzt weiß, schafft man Funktionen, die Messages verarbeiten, durch einen Rechtsklick auf das entsprechende Control im Dialog Editor und dann "Add Event Handler". Da habe ich dann meine abgeleitete Klasse angegeben und LVN_ITEMACTIVATE, weil mir die Beschreibung für die Aufgabe logisch erschien, ausgewählt. In der erstellten Funktion wollte ich mir dann eine Message Box ausgeben lassen, um Erfolg zu melden. Geht aber so nicht.

    Wahrscheinlich verstehe ich hier beim Event Handling was nicht richtig. Anders kann ich mir den Fehler nicht erklären.



  • ON_NOTIFY_REFLECT(NM_CLICK, &CMyListCtrl::OnNMClick)

    void CMyListCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    	pNMListView->iItem;	// ist der Index der Zeile
    	*pResult = 0;
    }
    

    oder mit
    ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, &CMyListCtrl::OnLvnItemchanged)



  • Aha, mir war Message Reflection nicht bekannt. NM_CLICK hatte ich auch schon ausprobiert, aber irgendwie da hat die IDE dann nur WM_NOTIFY zu meiner Klasse zugefügt. Natürlich bezieht sich diese Nachricht aber immer auf das Parent-Fenster, nicht auf die Control selbst. Daher passierte dann auch nichts.

    Gut, jetzt sollte es also in der Theorie funktionieren. Tut es aber trotzdem nicht. Hier mein Code. Sieht eigentlich genau so aus, wie vorgeschlagen:

    BEGIN_MESSAGE_MAP(CEntityList, CListCtrl)
    	ON_NOTIFY_REFLECT(NM_CLICK, &CEntityList::OnNMClick)
    END_MESSAGE_MAP()
    
    // CEntityList message handlers
    void CEntityList::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) {
    
    	MessageBox("Item clicked!", "Debug", MB_OK);
    
    	*pResult = 0;
    }
    

    Wird hier vielleicht einfach nur die Message Box nicht ausgegeben, oder wird die Methode tatsächlich nicht aufgerufen?

    EDIT: Nein, das wird wirklich nicht aufgerufen. Ich habe mal versucht, im Aufruf ein Item in eine andere List-View des Dialogs einzufügen. Da kommt aber nichts. Also wird diese Methode wirklich nicht aufgerufen? Was könnte da denn falsch sein?



  • Problem gelöst. Ich hatte in der Dialog-Klasse zuerst nur eine Member-Variable vom Typ CListCtrl angelegt und dann vergessen, auf den abgeleiteten Typ umzustellen. Also wurden die ganzen neuen Methoden natürlich nicht benutzt.


Anmelden zum Antworten