I am trying to make a TreeView with Nodes that habe several lines. I get it to draw the lines od text and a background, but the next Node starts in the second line and not below the first Node.
private void anf_DrawNode( |
object sender, DrawTreeNodeEventArgs e) |
{ |
StringFormat sf = new StringFormat(); |
sf.Trimming = StringTrimming.None; |
// 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.Beige, 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.Black, |
Rectangle.Inflate(NodeBounds(e.Node), 2, 0),sf); |
} |
// Use the default background and node text. |
else |
{ |
//e.DrawDefault = true; |
// 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.White, 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.Black, |
Rectangle.Inflate(NodeBounds(e.Node), 2, 0), sf); |
} |
// 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,sf); |
} |
// 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); |
} |
} |
e.Node.TreeView.PerformLayout(); |
} |
private Rectangle NodeBounds(TreeNode node) |
{ |
Rectangle bounds = node.Bounds; |
Graphics g = this.CreateGraphics(); |
int textWidth = (int)g.MeasureString(node.Text.ToString(), tagFont, (node.Bounds.Width - 50)).Width; |
int textHeight = (int)g.MeasureString(node.Text.ToString(), tagFont,(node.Bounds.Width-5)).Height + 20; |
bounds.Width = textWidth; |
bounds.Height = textHeight; |
node.Bounds.Inflate(new System.Drawing.Size(textWidth, textHeight+100)); |
return bounds; |
} |