Ttems in Treeview sortieren, Teillösung gefunden, wie gehts weiter?
-
Ok, mein Ziel ist es eine Funktion zu schreiben die, die Items eines Treeviewzweiges sortiert. Es werden neben dem Handel des Items, dessen subitems sortiert werden sollen 2 weitere Parameter übergeben, der eine legt die Sortierordnung fest, der andere gibt an ob noch zwischen Groß und Kleinschreibung unterschieden werden soll. Ich hab da mal eine Funktion geschriebn die beding funktioniert, und zwar für den Fall, daß keines der Childitems des Zweiges ebenfalls wieder Subitems enthält. Ich würde die Funktion nun gerne so realisieren, daß sie die Childitems die ebenfalls Childitems enthalten an den Anfang sortiert werden und dann erst sortiert die Childitems die keine Childitems enthlten. Bekanntes Beispiel ist der Explorer, hier werden die Ordner an den Anfanggestellt, dannach folgen die Dateien. So soll mein Treeview auch aussehen. Also hier mal mein Code und wie ich einen Zweig sortiere der nur Childitems ohne eigene Childitems enthält:
boolean TV_SortSubitems(HWND hWnd, HTREEITEM pItem, boolean absteigend, boolean ignorecase){ TVITEM tv_Item1, tv_Item2; HTREEITEM cItem1, cItem2, sItem; int anzahl = 0, i, j, result, lParam; char text1[512], text2[512]; cItem1 = TreeView_GetChild(hWnd, pItem); sItem = TreeView_GetSelection(hWnd); lParam = TV_GetItemLPARAM(hWnd, sItem); if(!cItem1){ return FALSE; } anzahl++; while(cItem1 = TreeView_GetNextSibling(hWnd, cItem1)){ anzahl++; } for(i = 0; i < anzahl - 1; i++){ cItem1 = TreeView_GetChild(hWnd, pItem); for(j = 0; j < anzahl - 1; j++){ cItem2 = TreeView_GetNextSibling(hWnd, cItem1); memset(&tv_Item1, 0, sizeof(tv_Item1)); tv_Item1.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT; tv_Item1.hItem = cItem1; tv_Item1.stateMask = TVIS_STATEIMAGEMASK; tv_Item1.pszText = text1; tv_Item1.cchTextMax = sizeof(text1); TreeView_GetItem(hWnd, &tv_Item1); memset(&tv_Item2, 0, sizeof(tv_Item2)); tv_Item2.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT; tv_Item2.hItem = cItem2; tv_Item2.stateMask = TVIS_STATEIMAGEMASK; tv_Item2.pszText = text2; tv_Item2.cchTextMax = sizeof(text2); TreeView_GetItem(hWnd, &tv_Item2); if(ignorecase == TRUE){ result = _stricmp(text1, text2); }else{ result = strcmp(text1, text2); } if(((absteigend == TRUE) &&(result > 0)) || ((absteigend == FALSE) &&(result < 0))){ tv_Item1.hItem = cItem2; tv_Item2.hItem = cItem1; TreeView_SetItem(hWnd, &tv_Item1); TreeView_SetItem(hWnd, &tv_Item2); } cItem1 = cItem2; } } sItem = TV_FindItemLPARAM(hWnd, lParam); TreeView_SelectItem(hWnd, sItem); return TRUE; }Leider hab ich noch nicht herausgefunden wie man zwei Items gegeneinader tauscht, wenn ein Item weitere Childitems enthält. Ich hoffe ich habe mich einigermassen verständlich ausgedrückt und jemand kann mir hier weiterhelfen. Ein guter Denkansatz wäre schon mal was.
-
Warum nimmst Du nicht TVM_SORTCHILDREN?
-
sri schrieb:
Warum nimmst Du nicht TVM_SORTCHILDREN?
Das funktioniert nicht so wie ich es gerne hätte. Die Funktion TVM_SORTCHILDRENCB macht aber genau das was ich brauche.