CTreeCtrl
-
Hallo allerseits
Ich wollte mich mal ein wenig mit CTreeCtrl beschäftigen und hab den Eintrag in der FAQ auch ganz hilfreich gefunden, aber eine Sache sollte ich noch wissen: Wie findet man heraus, auf welcher Hierarchiestufe ein Item liegt. Also in etwa so:
Bla // 1
_Blub // 1.1
_Blub2 // 1.2
__Blee // 1.2.1
_Blub3 // 1.3
Bla2 // 2... usw. Wie kann ich das da genau herausfinden? Wäre nett, wenn mir das einige Gurus verraten könnten... auf jeden Fall mal danke im Voraus und alles und so...
[ Dieser Beitrag wurde am 10.01.2003 um 17:02 Uhr von Phobos editiert. ]
-
komisch hab gerade in der online msdn
nachgesehen, da gibt es tatsächlich
keine funktion dafür.war das nicht einmal anders?
glaube das es GetDepth oder
GetLevel geben muß, falls nicht,
bleibt dir nichts anderes übrig
als den ganzen zweig rekursiv
durchzulaufen, bis du am root
ankommst, um die ebene deines
knotens herauszubekommen.gruß maze
-
Naja, das mit dem rekursiven Durchsuchen hab ich mir auch schon gedacht, habe aber keine Ahnung wie ichs machen könnte. Durch CTreeCtrl::GetNextItem() kriege ich ja die HTREEITEM-Struktur für den gerade ausgewählten Eintrag. Aber wie kriege ich von der dann die Hierarchiestufe? Wie gesagt, in der FAQ oder Suche hab ich nix gefunden
-
Eigendlich solltest du das ganze
mit der funktion GetParentItem
hinkriegen oder du benutzt GetNextItem
in verbindung mit ItemHasChildren.
beim letzteren weiß ich allerdings
nicht ob das erst ab .net existiert
(ItemHasChildren).Kannst dir ja dann ne GetDepth oder
GetLevel funktion selbst schreiben.
-
Hmm, ok, ich hab jetzt ne andere Idee, dafür müsste ich wissen, wie ich durch alle Childs von einem HTREEITEM iterieren kann. Also etwa so:
// hSelected enthält das angeklickte Item HTREEITEM hParent = m_ctrlTree.GetParentItem(hSelected); // Hier irgendwie alle Childs von hParent iterieren
Wie geht das denn genau? Auf diese Art und Weise könnte ich das solang machen, bis ich beim Root angekommen bin und dann krieg ich das ja auch raus....
-
das meinte ich auch.
soweit ich weiß bekommst du solange
einen gültigen wert zurück solange
ein parent existiert. ansonsten bekommst
du einen null pointer, was dann
heißt das der aktuelle Knoten der root.schau auber besser nochmal in der msdn nach.
-
Ja, aber damit bekomme ich ja nur die ebene in dem das Objekt liegt. Ein Beispiel:
Bla // 1
_Blub // 1.1
__Blee // 1.1.1
_Blub2 // 1.2
__Blee2 // 1.2.1
_Blub3 // 1.3
...Wenn ich das ganze jetzt nur bis zum Root mache, kriege ich ja bei beiden Blees 2 raus, weil sie in der 2. Ebene sind. Was ich jetzt will ist folgendes: Wenn der Benutzer Blee anklickt will ich das Parent davon (Blub) durchsuchen und wissen, an welchem Index davon das angeklickte Element ist, damit ich die Position im Baum eindeutig bestimmen kann. Und wenn ich diesen Index habe weiter: Ich nehm den Parent von Blub (Bla) und will den Index von Blub finden, bis ich beim Root bin. Eigentlich ja auch kein Problem, ich will jetzt aber wissen, wie ich eben einen Zweig (z.B. Blub) durchsuchen kann und überprüfen ob ein Index davon einer anderen HTREEITEM gleich ist...
Aber ich schau jetzt auch auf jeden Fall nochmal in der MSDN nach...
[Nachtrag]:
Hmm, also entweder ich bin d0f oder ich finde einfach nichts dazu...
[ Dieser Beitrag wurde am 10.01.2003 um 19:07 Uhr von Phobos editiert. ]
-
Hmm, scheine doch nicht zu d0f zu sein... hab eben was gefunden. Falls es wen interessiert: So kann man durch alle Items iterieren, in dessen Parent ein HTREEITEM liegt, das man ja mit mit CTreeCtrl::FindNext() mit TVGN_CARET finden kann:
// Das Item holen, indem der aktuell selektierte Eintrag liegt HTREEITEM hCurSel = m_ctrlTree.GetNextItem(TVI_ROOT, TVGN_CARET); // Das Parent von dem finden hCurSel = m_ctrlTree.GetNextItem(hCurSel, TVGN_PARENT); // ... und davon das erste Child HTREEITEM hCurrent = m_ctrlTree.GetNextItem(hCurSel, TVGN_CHILD); // Solange es Childs gibt while (hCurrent != NULL) { // Name davon ausgeben MessageBox(m_ctrlTree.GetItemText(hCurrent) ); // Nächstes finden hCurrent = m_ctrlTree.GetNextItem(hCurrent, TVGN_NEXT); }
-
Das gleiche unter Benutzung der Befehle, die uns die MFC extra bereitstellt:
// Das Item holen, indem der aktuell selektierte Eintrag liegt HTREEITEM hCurSel = m_ctrlTree.GetSelectedItem(); // Das Parent von dem finden hCurSel = m_ctrlTree.GetParentItem(hCurSel); // ... und davon das erste Child HTREEITEM hCurrent = m_ctrlTree.GetChildItem(hCurSel); // Solange es Childs gibt while (hCurrent != NULL) { // Name davon ausgeben MessageBox(m_ctrlTree.GetItemText(hCurrent) ); // Nächstes finden hCurrent = m_ctrlTree.GetNextSiblingItem(hCurrent); }