DrawTreeNodeEventArgs Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt Daten für das DrawNode-Ereignis bereit.
public ref class DrawTreeNodeEventArgs : EventArgs
public class DrawTreeNodeEventArgs : EventArgs
type DrawTreeNodeEventArgs = class
inherit EventArgs
Public Class DrawTreeNodeEventArgs
Inherits EventArgs
- Vererbung
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, einschließlich einer benutzerdefinierten Hervorhebungsfarbe.
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 TreeView.DrawNode Ereignis die Knotentags und die benutzerdefinierte Auswahlhighlight manuell. Nicht ausgewählte Knoten müssen nicht angepasst werden. Für diese wird die DrawDefault -Eigenschaft auf true
festgelegt, sodass sie vom Betriebssystem gezeichnet werden.
Darüber hinaus bietet ein Handler für das Control.MouseDown Ereignis Treffertests. Standardmäßig kann ein Knoten nur durch Klicken auf die Region um seine Bezeichnung ausgewählt werden. Der Control.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.
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
public ref class TreeViewOwnerDraw: public Form
{
private:
TreeView^ myTreeView;
// Create a Font object for the node tags.
System::Drawing::Font^ tagFont;
public:
TreeViewOwnerDraw()
{
tagFont = gcnew System::Drawing::Font( "Helvetica",8,FontStyle::Bold );
// Create and initialize the TreeView control.
myTreeView = gcnew 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 += gcnew DrawTreeNodeEventHandler( this, &TreeViewOwnerDraw::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 += gcnew MouseEventHandler( this, &TreeViewOwnerDraw::myTreeView_MouseDown );
// Initialize the form and add the TreeView control to it.
this->ClientSize = System::Drawing::Size( 292, 273 );
this->Controls->Add( myTreeView );
}
protected:
// Clean up any resources being used.
~TreeViewOwnerDraw()
{
if ( tagFont != nullptr )
{
delete tagFont;
}
}
// 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) != (TreeNodeStates)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.
System::Drawing::Font^ nodeFont = e->Node->NodeFont;
if ( nodeFont == nullptr )
nodeFont = (dynamic_cast<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 != nullptr )
{
e->Graphics->DrawString( e->Node->Tag->ToString(), tagFont, Brushes::Yellow, (float)e->Bounds.Right + 2, (float)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) != (TreeNodeStates)0 )
{
Pen^ focusPen = gcnew Pen( Color::Black );
try
{
focusPen->DashStyle = System::Drawing::Drawing2D::DashStyle::Dot;
Rectangle focusBounds = NodeBounds( e->Node );
focusBounds.Size = System::Drawing::Size( focusBounds.Width - 1, focusBounds.Height - 1 );
e->Graphics->DrawRectangle( focusPen, focusBounds );
}
finally
{
if ( focusPen )
delete safe_cast<IDisposable^>(focusPen);
}
}
}
// Selects a node that is clicked on its label or tag text.
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.
Rectangle NodeBounds( TreeNode^ node )
{
// Set the return value to the normal node bounds.
Rectangle bounds = node->Bounds;
if ( node->Tag != nullptr )
{
// 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->~Graphics();
}
return bounds;
}
};
[STAThreadAttribute]
int main()
{
Application::Run( gcnew TreeViewOwnerDraw );
}
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;
}
}
Imports System.Drawing
Imports System.Windows.Forms
Public Class TreeViewOwnerDraw
Inherits Form
Private WithEvents myTreeView As TreeView
' Create a Font object for the node tags.
Private tagFont As New Font("Helvetica", 8, FontStyle.Bold)
Public Sub New()
' 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.
Dim node As TreeNode
Dim x As Integer
For x = 1 To 3
' Add a root node to the TreeView control.
node = myTreeView.Nodes.Add(String.Format("Task {0}", x))
Dim y As Integer
For y = 1 To 3
' Add a child node to the root node.
node.Nodes.Add(String.Format("Subtask {0}", y))
Next y
Next x
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.
myTreeView.DrawMode = TreeViewDrawMode.OwnerDrawText
' 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.
AddHandler myTreeView.MouseDown, AddressOf myTreeView_MouseDown
' Initialize the form and add the TreeView control to it.
Me.ClientSize = New Size(292, 273)
Me.Controls.Add(myTreeView)
End Sub
<STAThreadAttribute()> _
Shared Sub Main()
Application.Run(New TreeViewOwnerDraw())
End Sub
' Draws a node.
Private Sub myTreeView_DrawNode(ByVal sender As Object, _
ByVal e As DrawTreeNodeEventArgs) Handles myTreeView.DrawNode
' Draw the background and node text for a selected node.
If (e.State And TreeNodeStates.Selected) <> 0 Then
' 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.
Dim nodeFont As Font = e.Node.NodeFont
If nodeFont Is Nothing Then
nodeFont = CType(sender, TreeView).Font
End If
' Draw the node text.
e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, _
e.Bounds.Left - 2, e.Bounds.Top)
' Use the default background and node text.
Else
e.DrawDefault = True
End If
' If a node tag is present, draw its string representation
' to the right of the label text.
If (e.Node.Tag IsNot Nothing) Then
e.Graphics.DrawString(e.Node.Tag.ToString(), tagFont, _
Brushes.Yellow, e.Bounds.Right + 2, e.Bounds.Top)
End If
' 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 And TreeNodeStates.Focused) <> 0 Then
Dim focusPen As New Pen(Color.Black)
Try
focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot
Dim focusBounds As Rectangle = NodeBounds(e.Node)
focusBounds.Size = New Size(focusBounds.Width - 1, _
focusBounds.Height - 1)
e.Graphics.DrawRectangle(focusPen, focusBounds)
Finally
focusPen.Dispose()
End Try
End If
End Sub
' Selects a node that is clicked on its label or tag text.
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
Dim clickedNode As TreeNode = myTreeView.GetNodeAt(e.X, e.Y)
If NodeBounds(clickedNode).Contains(e.X, e.Y) Then
myTreeView.SelectedNode = clickedNode
End If
End Sub
' Returns the bounds of the specified node, including the region
' occupied by the node label and any node tag displayed.
Private Function NodeBounds(ByVal node As TreeNode) As Rectangle
' Set the return value to the normal node bounds.
Dim bounds As Rectangle = node.Bounds
If (node.Tag IsNot Nothing) Then
' Retrieve a Graphics object from the TreeView handle
' and use it to calculate the display width of the tag.
Dim g As Graphics = myTreeView.CreateGraphics()
Dim tagWidth As Integer = CInt(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()
End If
Return bounds
End Function 'NodeBounds
End Class
Hinweise
Verwenden Sie das DrawNode -Ereignis, um die Darstellung von Knoten in einem TreeView Steuerelement mithilfe der Besitzerzeichnung anzupassen.
Das DrawNode Ereignis wird von einem TreeView Steuerelement ausgelöst, wenn seine TreeView.DrawMode Eigenschaft auf TreeViewDrawMode.OwnerDrawAll oder TreeViewDrawMode.OwnerDrawText festgelegt ist und ein Knoten angezeigt oder aktualisiert wird. Der DrawTreeNodeEventArgs an den Ereignishandler übergebene enthält Informationen über den zu zeichnenden Knoten sowie Methoden zum Zeichnen des Knotens.
Verwenden Sie die State -Eigenschaft oder Node , um Informationen über den zu zeichnenden Knoten abzurufen. Verwenden Sie die Graphics -Eigenschaft, um die tatsächliche Zeichnung innerhalb des von der -Eigenschaft angegebenen Bereichs Bounds zu erstellen. Damit das Betriebssystem einen Knoten zeichnet, der nicht vom Besitzer gezeichnet werden muss, legen Sie die DrawDefault -Eigenschaft auf fest true
.
Wenn die TreeView.DrawMode -Eigenschaft auf TreeViewDrawMode.OwnerDrawTextfestgelegt ist, enthält der von der Bounds -Eigenschaft angegebene Bereich nur den Bezeichnungsteil des Knotens. Wenn die TreeView.DrawMode -Eigenschaft auf TreeViewDrawMode.OwnerDrawAllfestgelegt ist, umfasst der Bounds Bereich den gesamten Knoten, einschließlich des Bereichs, der normalerweise für Symbole, Kontrollkästchen, Plus- und Minuszeichen und Linien verwendet wird, die die Knoten verbinden.
Konstruktoren
DrawTreeNodeEventArgs(Graphics, TreeNode, Rectangle, TreeNodeStates) |
Initialisiert eine neue Instanz der DrawTreeNodeEventArgs-Klasse. |
Eigenschaften
Bounds |
Ruft die Größe und die Position des zu zeichnenden TreeNode ab. |
DrawDefault |
Ruft einen Wert ab, der angibt, ob der TreeNode vom Betriebssystem und nicht durch Ownerdrawing gezeichnet werden soll, oder legt diesen fest. |
Graphics |
Ruft das Graphics-Objekt ab, mit dem der TreeNode gezeichnet wird. |
Node |
Ruft das zu zeichnende TreeNode ab. |
State |
Ruft den aktuellen Zustand des zu zeichnenden TreeNode ab. |
Methoden
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |