Drag&Drop in einem SysTreeView32
-
Grüße!
Leider komme ich mit Drag&Drop in einem SysTreeView32 nicht weiter. Genauergesagt ist bis auf das Verschieben von Branches alles fertig.
Einzelne Childs ohne weitere Childs zu verschieben geht schon. Allerdings macht mir das Rekursive Probleme...Das habe ich bis jetzt, gibt ne Endlosschleife beim verschieben eines Nodes mit >= 1 Child.
HWND treeView ... // Drag-Node durchlaufen und nach Drop-Node einfügen void AddTreeNode(HTREEITEM next, HTREEITEM root = 0) { TVITEM item = { }; item.hItem = next; item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_HANDLE | TVIF_SELECTEDIMAGE | TVIF_STATE; char buf[512] = { }; item.pszText = buf; item.cchTextMax = 512; TreeView_GetItem(treeView, &item); TVINSERTSTRUCT insertStruct = { }; if(root) insertStruct.hParent = root; else { insertStruct.hInsertAfter = 0; // ? insertStruct.hParent = TreeView_GetParent(treeView, next); } insertStruct.item = item; TreeView_InsertItem(treeView, &insertStruct); next = TreeView_GetChild(treeView, next); while(next) { AddTreeNode(next); next = TreeView_GetNextSibling(treeView, next); } } // Drop: AddTreeNode(dragItem, dropItem); TreeView_DeleteItem(treeView, dragItem);Hab sowas noch nie gemacht und hab einfach keine Ahnung warum das nicht klappt. Ist auch doof dokumentiert, gibt TreeView_GetNextSibling() nun Null zurück, wenn kein weiteres Element mehr in der Ebene ist, oder nur beim Root...
Toll wäre ein funktionierendes Beispiel.
Danke!
MfG
-
Hab ein tutorial gefunden! Jetzt sieht es schon sehr gut aus, allerdings kann man noch parents an indirekte childs hängen.
Wie könnte ich das überprüfen?
Und ist der Code so OK?Danke jedenfalls!
void AddTreeNode(HTREEITEM branch, HTREEITEM newParent) { HWND treeView = GetDlgItem(tabPageHandles[0], IDC_TREE1); TVINSERTSTRUCT insertStruct = { }; insertStruct.item.hItem = branch; insertStruct.item.mask = TVIF_TEXT; char buf[512] = { }; insertStruct.item.pszText = buf; insertStruct.item.cchTextMax = 512; TreeView_GetItem(treeView, &insertStruct.item); insertStruct.hParent = newParent; insertStruct.hInsertAfter = TVI_LAST; HTREEITEM hNewItem = TreeView_InsertItem(treeView, &insertStruct); HTREEITEM hChild = TreeView_GetChild(treeView, branch); while(hChild) { AddTreeNode(hChild, hNewItem); hChild = TreeView_GetNextSibling(treeView, hChild); } } // Aufruf (OnDrop): HTREEITEM dropItem = TreeView_GetDropHilight(treeView); if(TreeView_GetParent(treeView, dropItem) == m_dragItem) abort = true; if(dropItem == m_dragItem) abort = true; ... AddTreeNode(m_dragItem, dropItem); TreeView_DeleteItem(treeView, m_dragItem); ...
-
Habe es nun mit einer FindTreeEntry() Funktion ganz gut hinbekommen:
Danke trotzdem. Thema so ziemlich erledigt (Sieht jemand noch ein Problem mit dem Code? Gibt es eine unbehandelte Situation?).
MfG