2 Stimmen

Korrektes Rendering von überschriebenen TreeView

Ich hatte Probleme mit der Standard Windows Forms TreeView; speziell mit der Farbe, mit der das Standard-Steuerelement verwendet, um den ausgewählten Knoten zu rendern, wenn die Baumansicht nicht den Fokus hat. Dies war ein helles Grau, das auf manchen Bildschirmen fast unsichtbar war. Daraufhin habe ich die TreeView subclassed und die TreeView überschrieben OnDrawNode Ereignis, um meine Knoten nach Belieben zu färben. Dies funktioniert gut, aber jetzt "HotTracking" (aktive Hervorhebung, wenn die Maus über einen bestimmten Baumknoten ist) wird von meinem benutzerdefinierten überschrieben OnDrawNode Veranstaltung. Ich bin nicht allzu vertraut mit dem Graphics Klassen und fragte mich, wie ich meine aktuelle Unterklasse ändern kann, um Hot Tracking zu integrieren? Ich bin mir bewusst, dass ich Folgendes verwenden könnte e.Graphics.DrawLine(Pen pen, Point p1, Point p2); aber das wird unübersichtlich, gibt es einen einfacheren Weg?

Hier ist der bestehende Code:

class CustomTreeView : TreeView 
{
    public CustomTreeView() 
    {
        this.DrawMode = TreeViewDrawMode.OwnerDrawText;
    }

    // Override the drawMode of TreeView.
    protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
    {
        TreeNodeStates treeState = e.State;
        Font treeFont = e.Node.NodeFont ?? e.Node.TreeView.Font;

        // Colors.
        Color foreColor = e.Node.ForeColor;
        string strDeselectedColor = @"#6B6E77", strSelectedColor = @"#94C7FC"; //@"#1ABEE8"; //@"#2FC0EE"; //@"#3A8FEA";
        Color selectedColor = System.Drawing.ColorTranslator.FromHtml(strSelectedColor);
        Color deselectedColor = System.Drawing.ColorTranslator.FromHtml(strDeselectedColor);

        // New brush.
        SolidBrush selectedTreeBrush = new SolidBrush(selectedColor);
        SolidBrush deselectedTreeBrush = new SolidBrush(deselectedColor);

        // Set default font color.
        if (foreColor == Color.Empty)
            foreColor = e.Node.TreeView.ForeColor;

        // Draw bounding box and fill.
        if (e.Node == e.Node.TreeView.SelectedNode) 
        {
            // Use appropriate brush depending on if the tree has focus.
            if (this.Focused)
            {
                foreColor = SystemColors.HighlightText;
                e.Graphics.FillRectangle(selectedTreeBrush /*SystemBrushes.Highlight*/, e.Bounds);
                ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, SystemColors.Highlight);
                TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding);
            }
            else
            {
                foreColor = SystemColors.HighlightText;
                e.Graphics.FillRectangle(deselectedTreeBrush /*SystemBrushes.Highlight*/, e.Bounds);
                ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, SystemColors.Highlight);
                TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding);
            }
        }
        else 
        {
            // This is firing but is being over written, perhaps by the above?
            if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)
            {
                e.DrawDefault = true;
                e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
                TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, System.Drawing.Color.Blue, TextFormatFlags.GlyphOverhangPadding);
            }
            else
            {
                e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
                TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding);
           }   
        }
    }

Wie immer vielen Dank für Ihre Zeit.

5voto

Hans Passant Punkte 894572

Sie müssen in Ihrem Code auf e.State achten. Die Eigenschaft DrawTreeNodeEventArgs.State sagt Ihnen, was mit dem Knoten passiert, wählen Sie die Farben entsprechend. Schauen Sie sich auch das Beispiel in der MSDN-Bibliothek an, das in den Dokumenten für TreeNode.DrawNode gezeigt wird, um eine Anleitung zu erhalten.

0voto

Setzen Sie einfach die HotTracking von Ihnen TreeView auf true und es wird funktionieren, weil in TreeView, die Knoten, die es enthält nicht über Selbst-Identität als Kontrolle jeder und jeder Knoten wird von TreeView selbst zeichnen, während die Knoten enthält nur die Daten, Das ist, warum sie nicht über Ereignisse und die TreeView tut ganze Arbeit, also, um diese Hot-Status gesetzt bekommen

objTreeView.HotTracking = true;

TreeView wird Ihnen den Status anzeigen und Ihr Code wird gut funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X