CTreeCtrl rekursiv durchlaufen

Ravebaby

Erfahrenes Mitglied
Ich habe einen CTreeCtrl über eine Verzeichnisstruktur aufgebaut.
Nun möchte ich den Inhalt des CTreeCtrl rekursiv auslesen, aber bekomm die Geschichte mit Kindern und parents... einfach nicht hin. Jeder Ordner und jedes File soll ausgelesen werden...

Versuche waren:
Code:
while(rootItem = m_treeCtrl.GetRootItem()){
	textTmp = m_treeCtrl.GetItemText(rootItem);
	text = (char *)LPCTSTR(textTmp);
	dc.DrawText(text, &rect, 0);
	while (item = m_treeCtrl.GetNextItem(rootItem, TVGN_CHILD)) {
		textTmp = m_treeCtrl.GetItemText(item);
		text = (char *)LPCTSTR(textTmp);
		//rootItem = item;
		y += 20;
		tRect.MoveToY(y);
		dc.DrawText(text, tRect, 0);
		while (item = m_treeCtrl.GetNextItem(item, TVGN_NEXT)) {
			textTmp = m_treeCtrl.GetItemText(item);
			text = (char *)LPCTSTR(textTmp);
			//rootItem = item;
			y += 20;
			tRect.MoveToY(y);
			dc.DrawText(text, tRect, 0);
		}
	}
}

und

Code:
HTREEITEM CChildView::GetTreeItem(HTREEITEM item)
{
	HTREEITEM rootItem = item;
	while (item = m_treeCtrl.GetNextItem(rootItem, TVGN_CHILD)){
		if (m_treeCtrl.ItemHasChildren(item)) {
			item = m_treeCtrl.GetNextItem(item, TVGN_CHILD);
		}
		return item;
	}
}

aber da kommt immer nur Quatsch raus....
HILFE!
 
Der Code, den du da hast, ist nicht wirklich rekursiv.

A) die äusserste while-Schleife ist eine Endlosschleife. Du holst dir immer das Root-Item und das ist immer ungleich NULL, wenn du nix rauslöschst.

B) Der Abschnitt mit GetChild und Next würde sich gut in eine Funktion wegpacken lassen.

Die rekursive Funktion sollte einfach nur das Root-Item übergeben bekommen und dann:

Item bearbeiten
Wenn ein Child-Item da ist, damit die Funktion aufrufen
sonst wenn ein Next-Sibling da ist, damit die Funktion aufrufen
return
 
Falls es mal einer brauchen sollte:
Habe nun ne Breitensuche mit ner CList implementiert:
Code:
void CChildView::GetTreeItem(CDC* pDC)
{
	CList<HTREEITEM, HTREEITEM&> list;
	HTREEITEM child, sibling, root;
	CString textTmp;
	LPCTSTR text = NULL;

	// get root, print root, add root to list
	root = m_treeCtrl.GetRootItem();
	textTmp = m_treeCtrl.GetItemText(root);
	text = (char *)LPCTSTR(textTmp);
	TRACE(textTmp + "\n");
	list.AddTail(HTREEITEM(root));

	//check if the first element of the list is a folder
	//true: get all children, print them
	//false: delete it
	while(!list.IsEmpty()){
		if(m_treeCtrl.ItemHasChildren(list.GetHead()))
		{	
			child = m_treeCtrl.GetChildItem(list.GetHead());
			list.AddTail(HTREEITEM(child));
			textTmp = m_treeCtrl.GetItemText(child);
			TRACE(textTmp + "\n");
			while(sibling = m_treeCtrl.GetNextSiblingItem(child)) {
				list.AddTail(HTREEITEM(sibling));
				textTmp = m_treeCtrl.GetItemText(sibling);
				child = sibling;
				TRACE(textTmp + "\n");
			}
			list.RemoveHead();
		}
		else
		{
			list.RemoveHead();
		}
	}// end while
}
 
Zurück