none
[WinForms] Bug in TreeView.DrawNode? RRS feed

  • 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





    Mittwoch, 15. Januar 2020 08:35

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 problem

    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.

    Donnerstag, 16. Januar 2020 05:29
    Moderator
  • 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




    Freitag, 17. Januar 2020 13:40
  • 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.

    Dienstag, 21. Januar 2020 12:32
    Moderator