CTreeCtrl

CodeFatal

Erfahrenes Mitglied
Hallo,
ich hab eine CMyTreeCtrl von CTreeCtrl abgeleitet und möchte hier ein CTreeCtrl zeichnen, dass weder den Weissen Hintergrund noch den ganzen Rand-Kram hat. Wohl aber die Checkboxen ,Plus, Minus und Linien Support.

über die Flags kann ich den Rand aus und die Item-Einstellungen ein und ausblenden. Leider klappt das mit dem weissen Hintergrund nicht:-(
Daher meine Farge: Wie bekomm ich den weg :confused: muss ich da ne Funktion überladen :confused: Bzw. wenn ich den Tree selbst zeichnen muss, dann kann man die Checkboxen inklusive Text ja noch recht einfach mit der Funktion DrawFramControll(..) erledigen... wie aber bekomme ich die gepunktete Linie mit den Plus/Minus-Zeichen richtig hin? Gibt es da was ähnliches :confused:

Bräuchte da für den einen oder anderen Weg die entscheidende Hilfe... :google: und :google: hat leider nicht weiter geholfen... vermutlich wieder mal falsche Schlüsselwörter :suspekt:

Gruss Michael
 
Die gepunktete Linie kannst du mit der normalen MoveTo/LineTo-Funktionscombo malen, den aktuellen Pen einfach mit PS_DOT oder Ähnlichem erstellen.

Vorher könntest du testen, ob es klappt, im abgeleiteten TreeCtrl auf WM_ERASEBKGND einfach nichts zu tun (um den weissen Hintergrund wegzubekommen). Vermutlich wird das aber nicht so einfach sein.
 
Das Ereasebkgnd hilft nur wenn man den Kram selbst macht und das unter dem Ctrl liegende nicht löchen will. Da aber bei dem Standard Ctrl sowieso mit Weiß überpinselt wird, kann man keinen Unterschied erkennen:-(
PS_DOT steht mir aus unerklärlichen Gründen nicht zur Verfügung ->WinCE. Das Flag wird zwar ausdrücklich in der MSDN bestätigt und auch in einem Beispiel verwendet aber leider sagt mein Compiler nichts Gutes dazu. Kenn nur Solid und Dash. Witzigerweise wird aber in der DrawFocusRect der Dot verwendet... Falls das von irgendeinem schonmal geüberwunden wurde... Hilfe wär nett:)
Wenn ich den ganzen kram selber zeichne, dann brauch ich aber immernoch ne performante Funktion die mir die Plus&Co Kästchen malt. Mit MoveTo und Lineto wird es zwar klappen, aber irgendwie hab ich die Befürchtung, das das dann so performant ist, das ich mit den FPS mich unter jedem noch ertäglichen Niveau befinde. Hab da eh schon jede Schmerzgrenze überschritten.

Gruss Michael
 
Kannst du nicht mit
Code:
myTreeCtrl->GetDC()->SetBkMode(TRANSPARENT);
den Hintergrund des Controls auf transparent setzen?
 
Das hilft leider nicht...muss ich dazu nicht auch alles selber zeichnen? Also Quasi mit GetDC die GrafikTabel holen und dann alles selbst draufschaufeln... gäb sonst ja das TRANSPARENT-Flag in der Create(...) funktion aber das ja auch nie...
 
Danke
war zwar nicht ganz das was ich brauchte aber die Zeile
Code:
	CWnd::DefWindowProc( WM_PAINT, (WPARAM)dcsrc.GetSafeHdc(), 0 );//so malen, wie CTree das Defaultmäsig will
kannte ich nicht. und hat schonmal viel weg gemacht. Sieht zumindest schon mal fast so aus wie ich es möchte
Jetzt hab ich aber nen anderes Problem.
Ich habe meinen Transparent Algorithmus um die obrige Zeile gebastelt. Beim ersten Zeichnen ist auch alles ok. wenn ich aber scrolle oder einen Root öffne, dann müsste ich den zugrundeliegenden Dialog und alle anderen Elemente zwischen dem Dialog und meinem CTreeCtrl neu zeichnen, dann mein CTreeCtrl mit den geänderten Daten.
Und das alles aus dem CTreeCtrl heraus ohne Zugriff auf den Dlg selbst zu haben.

Wie kann ich Windows dazu veranlassen :confused:
Mir schwebt da die RedrawWindow Funktion vor, aber irgendwie hab ich da noch nicht die richtigen Flags gefunden...
Gruss Michael
 
Hab mal bischen mit den Invalidate Funktionen gespielt.

Wenn ich Invalidate(TRUE), InvalidateRect(ClientRect,TRUE); rufe, dann ist das Endergebniss zwar richtig, aber da der gesammte Hintergrund neu gezeichnet wird flackert es böse. Die Selben Funktionen mit FALSE flackern zwar nicht und reagieren wunderbar, allerdings sammelt sich ne Menge Pixel-Müll an.
Gibt es denn da keine sanftere Methode die das sinnvoller macht?
 
Überschreibe mal OnEraseBkgnd und gib nur TRUE zurück, ohne irgendwas zu machen. Das Flackern kommt hauptsächlich daher, dass der Hintergrund vorher gelöscht wird.

Dann musst du natürlich auch alles "invalidierte" neu zeichnen, um den Pixelmüll zu vermeiden.
 
Zuletzt bearbeitet:
Hilft leider auch nix,

Werd jetzt einfach das Standard-Verhalten nutzen:
Zur Verteidigung:
1) es ist Schneller
2) mit einem Geflacker bin ich nicht zufrieden
3) mit nem absolut schäbbigen Hintergrund bin ich ebenfalls nicht zufrieden

vielleicht fällt mir ja noch was übernacht ein...
Danke trotzdem für eure Hilfe... Hab ja was gelernt:)

Schönen Abend noch Michael
 
Zurück