P
freakSkater schrieb:
Danke PowerOff für deine Antwort.
Ich hab jetzt schon ein paar Stunden lang versucht deine Klasse zu erweitern bzw. abzuändern, sodass ich den Baum in ein CTreeCtrl bekomme (da SDI-Anwendung). Ich bekomme es aber wirklich nicht hin und bin am verzweifeln.
Hättest du vielleicht noch einen Tipp oder ähnliches parat, um mir in diesem Punkt vielleicht sogar noch weiter zu helfen?
Du musst Dir erstmal die Dokumentation zur TreeView-Control im Platform-SDK durchlesen, dann nochmal die Dokumentation zu CTreeControl in der MFC Dokumentation.
Leider hab ich selber mit der TreeView-Control noch nicht allzu viel gemacht, deswegen kann ich Dir da im Moment nicht gross weiterhelfen. Am Wochenende werde ich wahrscheinlich wieder GUI-Programmierung mit den MFC machen, vielleicht schaue ich mir dann das Ganze mal an. Hier zu Hause hab ich Linux, und ich kann mit meinem Web-Browser leider nicht auf die Online-MSDN-Library zugreifen, da sie den Internet Explorer erfordert.
Im Prinzip musst Du Folgendes in Erfahrung bringen:
Wie werden Knoten im TreeView-Control adressiert?
Wie erstellt und loescht man Knoten?
usw.
Meine Knoten-Klasse (Node) ist folgendermassen aufgebaut:
Jeder Knoten hat einen Titel und eine NodeMap mit Unter-Knoten, die dem aktuellen Knoten untergeordnet sind. So werden Baeume meist aufgebaut. Ich habe die std::map-Klasse genommen, da sie schnelles Suchen erlaubt, was von der Methode addPath() gebraucht wird. Die Methoden addPath() und print() rufen dieselben Methoden in jeweils untergeordneten Elementen auf, um ihre Aufgabe zu erledigen.
addPath() funktioniert so: Zuerst wird geprueft, ob der uebergebene Pfad einen Backslash enthaelt. Wenn nicht, dann adressiert der Pfad einen Blatt-Knoten im aktuellen Knoten, und kann damit sofort in die NodeMap eingetragen werden. Andernfalls bezieht sich der Pfad auf ein untergeordnetes Element. Der linke Teil vor dem Backslash ist lokal zu dem aktuellen Knoten, und wird daher dort gesucht und ggf. angelegt. Dann wird die addPath() Methode dieses Knotens mit dem Pfad rechts des Backslashes aufgerufen (der seinerseits weitere Backslashes enthalten kann). So entsteht der Baum.
print() funktioniert so: der Knoten gibt seinen Titel aus, und ruft die print()-Methode fuer alle untergeordneten Knoten aus, die in der NodeMap registriert sind.
Um jetzt die Knoten-Klasse anzupassen, damit sie auch fuer TreeView funktioniert, musst Du zunaechst die oben genannten Dinge uber das TreeView-Control in Erfahrung bringen. Wenn jeder Knoten im TreeView eine eigene Adresse (z.B. ein Handle oder einen Index) hat, kannst Du in meiner Node-Klasse eine Variable anlegen, die das Handle oder den Index abspeichert. Ggf. musst Du den Konstruktor von Node abaendern, so dass er zurueck auf das uebergeordnete Element zeigt (das geht leicht, wenn Du dieses als Parameter an den Konstruktor uebergibst). Im Konstruktor kannst Du dann eine Message an das TreeView-Control schicken, um einen Knoten anzulegen. Im Destruktor musst Du eine Message schicken, um den Knoten aus dem TreeView zu entfernen. usw.
So jedenfalls wuerde ich es machen.