Auf Englisch lesen

Freigeben über


TreeView.DrawNode Ereignis

Definition

Tritt ein, wenn ein TreeView gezeichnet wird und die DrawMode-Eigenschaft auf einen anderen TreeViewDrawMode-Wert als Normal festgelegt ist.

C#
public event System.Windows.Forms.DrawTreeNodeEventHandler DrawNode;
C#
public event System.Windows.Forms.DrawTreeNodeEventHandler? DrawNode;

Ereignistyp

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie ein TreeView Steuerelement mithilfe der Besitzerzeichnung angepasst wird. Das TreeView Steuerelement im Beispiel zeigt optionale Knotentags neben den Standardknotenbezeichnungen an. Knotentags werden mithilfe der TreeNode.Tag -Eigenschaft angegeben. Das TreeView Steuerelement verwendet auch benutzerdefinierte Farben, die eine benutzerdefinierte Hervorhebungsfarbe enthalten.

Sie können die TreeView meisten Farben anpassen, indem Sie Farbeigenschaften festlegen, aber die Auswahlmarkierungsfarbe ist nicht als Eigenschaft verfügbar. Darüber hinaus erstreckt sich das Standardauswahlhighlight-Rechteck nur um eine Knotenbezeichnung. Die Besitzerzeichnung muss verwendet werden, um die Knotentags zu zeichnen und ein benutzerdefiniertes Hervorhebungsrechteck zu zeichnen, das groß genug ist, um ein Knotentag zu enthalten.

Im Beispiel zeichnet ein Handler für das DrawNode Ereignis die Knotentags und die benutzerdefinierte Auswahlhighlight manuell. Nicht ausgewählte Knoten müssen nicht angepasst werden. Für diese wird die DrawTreeNodeEventArgs.DrawDefault -Eigenschaft auf true festgelegt, sodass sie vom Betriebssystem gezeichnet werden.

Darüber hinaus bietet ein Handler für das MouseDown Ereignis Treffertests. Standardmäßig kann ein Knoten nur durch Klicken auf die Region um seine Bezeichnung ausgewählt werden. Der MouseDown Ereignishandler wählt einen Knoten aus, auf den an einer beliebigen Stelle innerhalb dieser Region oder innerhalb der Region um ein Knotentag geklickt wird, falls vorhanden.

C#
using System;
using System.Drawing;
using System.Windows.Forms;

public class TreeViewOwnerDraw : Form
{
    private TreeView myTreeView;

    // Create a Font object for the node tags.
    Font tagFont = new Font("Helvetica", 8, FontStyle.Bold);

    public TreeViewOwnerDraw()
    {
        // Create and initialize the TreeView control.
        myTreeView = new TreeView();
        myTreeView.Dock = DockStyle.Fill;
        myTreeView.BackColor = Color.Tan;
        myTreeView.CheckBoxes = true;

        // Add nodes to the TreeView control.
        TreeNode node;
        for (int x = 1; x < 4; ++x)
        {
            // Add a root node to the TreeView control.
            node = myTreeView.Nodes.Add(String.Format("Task {0}", x));
            for (int y = 1; y < 4; ++y)
            {
                // Add a child node to the root node.
                node.Nodes.Add(String.Format("Subtask {0}", y));
            }
        }
        myTreeView.ExpandAll();

        // Add tags containing alert messages to a few nodes 
        // and set the node background color to highlight them.
        myTreeView.Nodes[1].Nodes[0].Tag = "urgent!";
        myTreeView.Nodes[1].Nodes[0].BackColor = Color.Yellow;
        myTreeView.SelectedNode = myTreeView.Nodes[1].Nodes[0];
        myTreeView.Nodes[2].Nodes[1].Tag = "urgent!";
        myTreeView.Nodes[2].Nodes[1].BackColor = Color.Yellow;

        // Configure the TreeView control for owner-draw and add
        // a handler for the DrawNode event.
        myTreeView.DrawMode = TreeViewDrawMode.OwnerDrawText;
        myTreeView.DrawNode += 
            new DrawTreeNodeEventHandler(myTreeView_DrawNode);

        // Add a handler for the MouseDown event so that a node can be 
        // selected by clicking the tag text as well as the node text.
        myTreeView.MouseDown += new MouseEventHandler(myTreeView_MouseDown);

        // Initialize the form and add the TreeView control to it.
        this.ClientSize = new Size(292, 273);
        this.Controls.Add(myTreeView);
    }

    // Clean up any resources being used.        
    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            tagFont.Dispose();
        }
        base.Dispose(disposing);
    }

    [STAThreadAttribute()]
    static void Main() 
    {
        Application.Run(new TreeViewOwnerDraw());
    }

    // Draws a node.
    private void myTreeView_DrawNode(
        object sender, DrawTreeNodeEventArgs e)
    {
        // Draw the background and node text for a selected node.
        if ((e.State & TreeNodeStates.Selected) != 0)
        {
            // Draw the background of the selected node. The NodeBounds
            // method makes the highlight rectangle large enough to
            // include the text of a node tag, if one is present.
            e.Graphics.FillRectangle(Brushes.Green, NodeBounds(e.Node));

            // Retrieve the node font. If the node font has not been set,
            // use the TreeView font.
            Font nodeFont = e.Node.NodeFont;
            if (nodeFont == null) nodeFont = ((TreeView)sender).Font;

            // Draw the node text.
            e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White,
                Rectangle.Inflate(e.Bounds, 2, 0));
        }

        // Use the default background and node text.
        else 
        {
            e.DrawDefault = true;
        }

        // If a node tag is present, draw its string representation 
        // to the right of the label text.
        if (e.Node.Tag != null)
        {
            e.Graphics.DrawString(e.Node.Tag.ToString(), tagFont,
                Brushes.Yellow, e.Bounds.Right + 2, e.Bounds.Top);
        }

        // If the node has focus, draw the focus rectangle large, making
        // it large enough to include the text of the node tag, if present.
        if ((e.State & TreeNodeStates.Focused) != 0)
        {
            using (Pen focusPen = new Pen(Color.Black))
            {
                focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                Rectangle focusBounds = NodeBounds(e.Node);
                focusBounds.Size = new Size(focusBounds.Width - 1, 
                focusBounds.Height - 1);
                e.Graphics.DrawRectangle(focusPen, focusBounds);
            }
        }
    }

    // Selects a node that is clicked on its label or tag text.
    private void myTreeView_MouseDown(object sender, MouseEventArgs e)
    {
        TreeNode clickedNode = myTreeView.GetNodeAt(e.X, e.Y);
        if (NodeBounds(clickedNode).Contains(e.X, e.Y))
        {
            myTreeView.SelectedNode = clickedNode;
        }
    }

    // Returns the bounds of the specified node, including the region 
    // occupied by the node label and any node tag displayed.
    private Rectangle NodeBounds(TreeNode node)
    {
        // Set the return value to the normal node bounds.
        Rectangle bounds = node.Bounds;
        if (node.Tag != null)
        {
            // Retrieve a Graphics object from the TreeView handle
            // and use it to calculate the display width of the tag.
            Graphics g = myTreeView.CreateGraphics(); 
            int tagWidth = (int)g.MeasureString
                (node.Tag.ToString(), tagFont).Width + 6;

            // Adjust the node bounds using the calculated value.
            bounds.Offset(tagWidth/2, 0);
            bounds = Rectangle.Inflate(bounds, tagWidth/2, 0);
            g.Dispose();
         }
        
        return bounds;
    }
}

Hinweise

Verwenden Sie dieses Ereignis, um die Darstellung von Knoten in einem TreeView Steuerelement mithilfe der Besitzerzeichnung anzupassen.

Dieses Ereignis wird nur ausgelöst, wenn die DrawMode -Eigenschaft auf TreeViewDrawMode Werte von OwnerDrawAll oder OwnerDrawTextfestgelegt ist. Die folgende Tabelle gibt an, wie angepasst TreeNode werden kann, wenn die DrawMode Eigenschaft auf diese Werte festgelegt ist.

DrawMode-Eigenschaftswert TreeNode-Anpassung
OwnerDrawText Der TreeNode Bezeichnungsbereich kann angepasst werden. Alle anderen TreeNode Elemente werden automatisch gezeichnet.
OwnerDrawAll Das Erscheinungsbild des Gesamten TreeNode kann angepasst werden. Symbole, Kontrollkästchen, Plus- und Minuszeichen und Linien, die die Knoten verbinden, müssen manuell gezeichnet werden, wenn sie gewünscht sind.

Die Region, die der TreeNode.Text Wert belegen würde, wenn er mit der Schriftart gezeichnet würde, die durch die TreeView -Eigenschaft des Steuerelements Font angegeben wurde, ist die Region, in der auf einen Knoten geklickt werden kann, um ihn auszuwählen. Dies wird als Treffertestbereich bezeichnet. Wenn Sie außerhalb dieser Region zeichnen, sollten Sie Ihren eigenen Code bereitstellen, der einen Knoten auswählt, wenn auf seinen sichtbaren Bereich geklickt wird.

Der Treffertestbereich entspricht der DrawTreeNodeEventArgs.Bounds -Eigenschaft bei Verwendung OwnerDrawTextvon . Bei Verwendung von OwnerDrawAllumfasst die DrawTreeNodeEventArgs.Bounds -Eigenschaft jedoch die gesamte Breite von TreeView. In diesem Fall können Sie auf die Treffertestregion zugreifen, indem Sie den Wert abrufen und auf seine DrawTreeNodeEventArgs.NodeTreeNode.Bounds Eigenschaft zugreifen. Sie können dann den Treffertestbereich des Knotens innerhalb dieser Grenzen zeichnen, oder Sie können Ihren eigenen Treffertestcode bereitstellen. Beachten Sie, dass das Festlegen der TreeNode.NodeFont -Eigenschaft die Größe des Treffertestbereichs nicht ändert, die mit der für den gesamten TreeViewangegebenen Schriftart berechnet wird.

Weitere Informationen zum Behandeln von Ereignissen finden Sie unter behandeln und Auslösen von Ereignissen.

Gilt für:

Produkt Versionen
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9, 10

Weitere Informationen