CListCtrl Sortierung - verschiedene Ansätze
-
Hallo,
ich schlage mich gerade mit den verschiedenen Möglichkeiten der Sortierung eines CListCtrl rum.
Mein Problem: ich möchte die Items
A ) über einen klick auf den Header sortieren können,
B ) UND dabei NACH Beendigung der Sortierung, die Art der Sortierung (was wurde sortiert) in ein Protokoll schreiben
C ) UND dabei auch noch die kleinen ‚schicken‘ Dreiecke (die, die die Sortierung anzeigen) im Header erhalten.Es soll dabei A, B und C erfüllt sein.
Folgende Ansätze habe ich 'ergoogelt':
Ansatz 1: (aus dem Beispiel: NewControls Page5)
virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn); int CMyListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn) { // }
Funktioniert prima – allerdings ist B ) nicht erfüllt.
Ansatz 2:
afx_msg void OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult); ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CSortListCtrl::OnColumnclick) void CSortListCtrl::OnColumnclick(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); ... NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; ... SortItems((PFNLVCOMPARE)CompareMyImportantItems,…) }
Funktioniert prima – allerdings ist C ) nicht erfüllt.
Ansatz 3:
ON_MESSAGE(LVM_SORTITEMS, &CSMyListCtrl::OnMySortItems) LRESULT CMyListCtrl::OnMySortItems(WPARAM wParam, LPARAM lParam) { // was ist hier zu erledigen? return 0L; }
Funktioniert nicht – allerdings ist C ) erfüllt.
Fragen:
Gibt es irgend ein Event, dass nach der Fertigstellung der Sortierung ‚abgefangen‘ werden kann?
Dann könnte ich Ansatz 1 verwenden.Oder können beim Ansatz 2 die ‚kleinen Dreiecke‘ aktiviert werden? (Vermutlich nicht, da es nur ein ColumnKlick ist?)
Mein Favorit ist Ansatz 3. Allerdings ist mir völlig unklar, wie ich so die Sortierung ‚anstoßen‘ kann. Wie könnte da eine Lösung aussehen?
-
schaue mal diesen Beitrag
[url] http://www.c-plusplus.net/forum/264327 [/url]
das Dreieck kannst Du über die Headerstructur des CListCtrl setzen.
Turmfalke64
-
Vielen Dank Turmfalke64.
Das waren genau die richtigen Hinweise.Falls jemand mal das gleiche Problem hat: hier die Lösung zum Ansatz 2:
CMFCHeaderCtrl* pHeader = &GetHeaderCtrl(); pHeader->SetSortColumn(pNMListView->iSubItem, ...);
Nochmals vielen Dank - damit ist mein 'Strafreferat' fast fertig :xmas1:
-
Wie initialisierst Du das CMFCHedaerCtrl (&GetHeaderCtrl)?
Von welchem Typ ist die Liste?Ich habe jetzt von CListCtrl auf CMFCListCtrl umgestellt. Jetzt erscheint zwar wie gewünscht das "Dreieck", aber dafür wird jetzt weder OnNMCustomdraw noch OnLvnColumnclick ausgeführt. OnNMDblclk und OnNMRclick funktionieren. Bei allen Ereignissen führe ich aber Funtionen aus.