Fragensteller
[WinForms] Bug in TreeView.DrawNode?

Frage
-
Hallo,
ich verwende eine TreeView, bei der "HideSelection" auf false steht, damit die ausgewählte Node auch dann farblich hervorgehoben bleibt, wenn die TreeView keinen Fokus hat. Bei fokussierter TreeView wird die Node normalerweise mit dem üblichen blauen Hintergrund versehen, bei nicht fokussierter TreeView mit einem grauen Hintergrund (bei den Default-Farbeinstellungen von Windows).
Wenn der DrawMode der TreeView auf "OwnerDrawText" gesetzt wird und der Eventhandler wie folgt aussieht (C++/CLI):
void Tree_DrawNode (System::Object^ sender, System::Windows::Forms::DrawTreeNodeEventArgs^ e) { e->DrawDefault = true; }
sollte laut MS-Doku das sichtbare Ergebnis dasselbe sein wie DrawMode=Normal. Das ist es auch, mit einer Ausnahme: Wenn die TreeView keinen Fokus hat, wird die ausgewählte Node trotzdem mit dem *blauen* Hintergrund unterlegt und nicht mit dem grauen. Die Farbe der Beschriftung wechselt dabei trotzdem von weiß auf schwarz. Schwarz auf dunkelblau ist aber nicht gerade bequem zu lesen.
Mach ich hier noch was falsch, oder ist das tatsächlich ein Bug in der TreeView? Und falls ja, kann man diesen umschiffen, ohne die Node komplett selbst zu zeichnen?
Noch zur Info: Ich benötige das "OwnerDrawText" nur, um den angezeigten Text existierender Nodes selbst dynamisch anpassen zu können (Überschreiben von ToString() der Nodes bringt hier leider nichts, da die TreeView den anzuzeigenden Text offenbar zwischenspeichert und ToString() nicht bei jedem Zeichenvorgang aufruft)
Das Projekt verwendet .NET 4.0 unter VS 2017 und C++/CLI.
Danke schonmal für die Hilfe!
Holger
- Bearbeitet LutexH Mittwoch, 15. Januar 2020 11:48
- Verschoben Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 21. Januar 2020 12:33 Aus Windows Desktop Entwicklung
Alle Antworten
-
Hallo LutexH,
Dein Problem kann durch einige unsichtbare Knoten verursacht werden, die an derselben Position gezeichnet werden. Es kann behoben werden, indem solche unsichtbaren Knoten mithilfe der TreeNode.IsVisible-Eigenschaft im Handler des DrawNode-Ereignisses gefiltert werden, wie in diesem Artikel beschrieben:
TreeView Owner Draw problemGruß,
Ivan Dragov
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo Ivan,
danke für die Antwort. Nur was bedeutet hier konkret "filtern"?
Hab eben folgendes probiert:
void Tree_DrawNode (System::Object^ sender, System::Windows::Forms::DrawTreeNodeEventArgs^ e) { if (!e->Node->IsVisible) return; e->DrawDefault = true; }
-> Ergebnis ist dasselbe, d.h. schwarze Schrift auf blauem Untergrund, wenn die TreeView keinen Fokus hat
if (e->Node->IsVisible) e->DrawDefault = true;
-> dito
if (!e->Node->IsVisible) e->DrawDefault = true;
-> jetzt stimmt die Hintergrundfarbe und auch die Größe der Rechtecke entsprechend des anzuzeigenden Textes, aber die Texte selbst werden bei allen Nodes nicht gezeichnet (also nur die Hierarchie-Linien und das Rechteck auf ansonsten weißem Grund).
Ich hatte eben schon Screenshot-Ausschnitte hierzu eingefügt, darf die aber nicht hochladen ("Der Textkörper darf keine Bilder enthalten, bis Ihr Konto von uns geprüft werden kann").
Gruß
Holger
-
Hallo Holger,
Ich verschiebe den Thread zur besseren Unterstützung ins Visual C++/CLI-Forum.
Gruß,
Ivan Dragov
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.