Bekomme CTreeCtrl nicht auf

Olaf Lehmann

Mitglied
Hallo,
brauche zum ersten Mal eine Baumstruktur und bekomme das Ding nicht auf.
Die Baumstruktur soll erst an einer bestimmten Stelle erscheinen und nicht bereits beim Programmstart sichtbar sein.

Wenn ich beispielsweise einen CFileDialog öffne, schreibe ich einfach:

Code:
CFileDialog m_dlgFile(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY , NULL  );
und schon wird das Ding angezeigt.

Bei:
Code:
CTreeCtrl pTreeCtrl;
HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL);
HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel);
...

wird nichts angezeigt. Hinter pTreeCtrl werden keine Klammern akzeptiert, in die ich eventuell TRUE eingeben könnte.

Code:
pTreeCtrl.DoModal();
danach wird ebenfalls nicht akzeptiert.
:confused:

P.S.: Ich arbeite mit Visual C++6.0 und ohne Dokument/Ansicht-Architektur.

Gruß
Olaf
 

MCoder

Erfahrenes Mitglied
CTreeCtrl ist kein Dialog sondern ein Steuerelement und daher anderes zu behandeln. Du musst das Fenster erst mal erzeugen: pTreeCtrl.Create( ... ).
Anzeigen oder Ausblenden erfolgt dann mit der Methode ShowWindow.

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Auwiea, diesmal ist es ja wirklich wie schwimmen im Teer...

Code:
CTreeCtrl pTreeCtrl;
	CRect rectDummy;
	rectDummy.SetRectEmpty();
pTreeCtrl.Create(WS_CHILD | WS_VISIBLE | WS_BORDER , rectDummy, this, 1);

HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL);
HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel);
pTreeCtrl.ShowWindow(SW_SHOW);

müsste dann nicht irgendetwas auf dem Bildschirm zu sehen sein?

Gruß
Olaf
 

Olaf Lehmann

Mitglied
Code:
CTreeCtrl pTreeCtrl;
pTreeCtrl.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(100,20,300,700), this, 1);
HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL);
HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel);
pTreeCtrl.ShowWindow(SW_SHOW);
UpdateWindow();

Immerhin zeigt das nun etwas an. Nämlich das Wort Wurzel. :)

Aber nun gibts Fragen über Fragen:
Wieso sehe ich keine Baumstruktur?
Wenn ich auf das Wort "Wurzel" klicke oder doppelklicke, sollte sich dann nicht die darunterliegende Ebene öffnen, also "Kind1" erscheinen?
Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe? Ist das nicht bei dergleichen Stammbäumen so üblich?
Muss man das etwa alles selber programmieren?

Kennt jemand ein verständliches Tutorial zu dem Problem/den Problemen? Mit meinem Buch von Susanne Wigard komme ich überhaupt nicht klar (nicht nur zu diesem Thema).

Danke
Olaf
 
Zuletzt bearbeitet:

Olaf Lehmann

Mitglied
Zitat von Olaf Lehmann
Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe?

Was meinst du damit?

Der Stammbaum soll an einer bestimmten Stelle in einer Funktion, die durch Mausklick auf einen Button ausgelöst wird, warten bis ich aus dem Stammbaum etwas ausgewählt habe und nicht vorher einfach fortfahren den nachfolgenden Code auszuführen.

Durch Hinzunahme der drei Styles erscheint jetzt das Plus. :)
Wenn ich darauf klicke erscheint die untere Ebene aber noch nicht.

Muss ich dazu zusätzlich CTreeView benutzen?

MfG
Olaf
 

MCoder

Erfahrenes Mitglied
CTreeView brauchst du nicht noch zusätzlich. Es hat hinsichtlich der Baumstruktur keine anderen oder weitergehenden Funktion als CTreeCtrl. Es erzeugt nur ein Ansichtsfenster, das in SDI- oder MDI-Projekten verwendet werden kann.

Warum die nächste Ebene nicht angezeigt wird, ist mir nicht klar. Der Code zum Erzeugen der Items ist korrekt. Evt. zeigst du mal etwas mehr.

Die Sache mit dem Warten, ist mir leider noch viel klarer geworden. Das TreeCtrl nimmt die Daten für die Baumstruktur auf und visualisiert sie. Beim Auswählen von Elementen oder dem Auf- bzw. Zuklappen von Hierarchien werden Events ausgelöst, die man bei Bedarf behandeln kann. Weitergehende Funktionalitäten gehören nicht zum TreeCtrl und ich wüsste auch nicht wozu.

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Morgen MCoder!

Ich glaub wenn ich jetzt mehr Code hier poste, das führt nicht weiter. Der ganze Code unter dem Button ist über 1000 Zeilen lang.
Ich versuche mal auf die Schnelle den eigentlichen Hintergrund aufzuhellen:

Es handelt sich um ein Telemetryprogramm (dasselbe zu dem ich vor Monaten schon mal paar Fragen gestellt hatte). Das liest aus einem Replay Telemetrydaten wie Drehzahl, Gang, Leistung, usw. aus und stellt die Daten dann graphisch auf die Runde bezogen dar.
Nun gibt es einen Schalter "Laden". Drücke ich auf diesen Schalter geht erstmal eine Dateiauswahlbox auf. Darin wähle der Anwender das entsprechende Replay aus. Nach der Auswahl werden die Telemetrydaten eingelesen (und zwar deesjenigen Fahrers, der das Replay gespeichert hat - und zwar ALLE seine gefahrenen Runden. SELBSTVERSTÄNDLICH wird solange der Anwender in der Dateiauswahlbox keine Auswahl getroffen hat NiCHT der nachfolgende "Schaltercode" ausgeführt, sondern erst nach der Auswahl damit fortgefahren. Das funktioniert alles schon perfekt. Aber nur mit den Daten eines Fahrers nämlich desjenigen, der das Replay gespeichert hat.

Nun will ich aber auch dier Daten der anderen Fahrer anzeigen. Hierzu müssen nachdem das Replay vom Anwender ausgewählt worden ist, erstmal alle Fahrernamen und zu jedem Fahrer die zugehörigen Rundenzeiten eingelesen werden. Dannach muss eine Auswahl getroffen werden, da das Einlesen aller Runden aller Fahrer nicht sinnvoll wäre (und Stunden dauern würde). Hier soll dann die Baumstruktur ins Spiel kommen. Der Stammbaum soll in der obersten Ebene die Fahrernamen anzeigen und eine Ebene tiefer (wenn ich auf das Plus klicke) die Rundenzeiten. Wenn ich dann auf eine Rundenzeit klicke sollen die Telemetrydaten dieser einen Runde des ausgewählten Fahrers eingelesen werden.

Nun ist es bisher aber so, dass die Baumstruktur aufgeht und die Fahrernamen anzeigt (praktisch ist das natürlich im Moment noch nicht so programmiert - bis jetzt steht da ja probehalber erstmal "Wurzel"). Während der Anwender versucht, dort etwas auszuwählen und dazu braucht er ja ein paar Sekunden, wird bereits der nachfolgende "Schaltercode" ausgeführt, anstatt zu warten bis überhaupt klar ist, welche Runde welches Fahrers eingelesen werden soll. Das ist natürlich nicht im Sinne des Erfinders.
Hier nochmal der Vergleich mit CFile. Nachdem die Dateiauswahlbox aufgegangen ist, wird ja auch erst dann der nachfolgende Code ausgeführt, wenn eine Datei vom Anwender ausgewählt wurde, da in der Regel danach auf die ausgewählte Datei und keine andere zugegriffen werden soll.

Das zweite Problem ist wie gesagt, dass ich die Pluszeichen nicht öffnen kann und somit nicht in die darunterliegende Ebene (Rundenzeiten) gelange.

So, ich hoffe ich konnte nun klarstellen, was ich meine...

MfG
Olaf

P.S.: Ich erwähne nochmal: VisualC++ 6.0. Vielleicht ist da was anders als mit moderneren Compilern?
 
Zuletzt bearbeitet:

MCoder

Erfahrenes Mitglied
Hallo Olaf,

du brauchst natürlich nicht alle Daten in einem Rutsch einlesen, sondern nur in Ahängigkeit von der Auswahl. Das heißt, du schreibst erst mal nur die Fahrernahmen in den Baum und dazu jeweils einen Dummy-Child, damit das Plus sichtbar wird. Sobald der Nutzer die Hierarchie öffnen will, wird eine Notification Message (TVN_ITEMEXPANDING) gesendet. Dafür musst du einen Eventhandler einrichten, in dem du dann die Rundenzeiten einlesen kannst (jweils wieder mit Dummy-Child für's Pluszeichen). Wird dann da die Hierarchie geöffnet, werden dann die Telemetrydaten ebenso gelesen.

Bei deinen zweiten Problem kann ich dir leider nicht helfen, da ich in deinem Codefragment keinen Fehler erkennen kann. Das Problem liegt daher möglicherweise an einer anderen Stelle. Verzichte mal auf den ShowWindow()-Aufruf; mit WS_VISIBLE wird das Control sowieso sichtbar.

Gruß
MCoder