2012-12-11 113 views
1

我有一个TreeView,它的每个Node.Text都有两个单词。 第一个和第二个单词应该有不同的颜色。我已经在使用DrawMode属性和DrawNode事件更改文本的颜色,但我无法弄清楚如何将Node.Text分成两种不同的颜色。有人指出我可以使用TextRenderer.MeasureText,但我没有想法如何/在哪里使用它。Treenode文本不同颜色的字

有人有想法吗?


代码:

formload() 
{ 
    treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText; 
} 

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
{ 
Color nodeColor = Color.Red; 
if ((e.State & TreeNodeStates.Selected) != 0) 
    nodeColor = SystemColors.HighlightText; 

TextRenderer.DrawText(e.Graphics, 
        e.Node.Text, 
        e.Node.NodeFont, 
        e.Bounds, 
        nodeColor, 
        Color.Empty, 
        TextFormatFlags.VerticalCenter); 
} 
+0

你能解释你的代码吗? –

+0

在winforms中是不可能的,你必须使用一个图像。 – MrFox

+0

@MrFox这是从不可能的FAR – phadaphunk

回答

6

试试这个:

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
    { 
     string[] texts = e.Node.Text.Split(); 
     using (Font font = new Font(this.Font, FontStyle.Regular)) 
     { 
      using (Brush brush = new SolidBrush(Color.Red)) 
      { 
       e.Graphics.DrawString(texts[0], font, brush, e.Bounds.Left, e.Bounds.Top); 
      } 

      using (Brush brush = new SolidBrush(Color.Blue)) 
      { 
       SizeF s = e.Graphics.MeasureString(texts[0], font); 
       e.Graphics.DrawString(texts[1], font, brush, e.Bounds.Left + (int)s.Width, e.Bounds.Top); 
      } 
     } 
    } 

您必须管理节点做拨款行动State

UPDATE

对不起,我错看到更新后的版本。没有必要测量空间大小,因为它已经包含在texts[0]中。

+0

天才!没有突出显示整个文本的突出显示有一个小问题。但我会弄清楚如何改正这一点。 还有一件事。有没有一种方法可以用一个单词来捕捉节点? (在最后一行崩溃程序),因为这是一种罕见但可能的结果。 – phadaphunk

+0

如果您尝试过使用您的程序,可能是您遇到了这个故障(将在另一个问题中发布)我实施了类似于您在一周前给予我的解决方案,并出现图形故障,其中节点未在正确的位置绘制。这就是为什么我今天再次问,但这个故障仍然存在。 – phadaphunk

+0

问题在这里谢谢! http://stackoverflow.com/questions/13825167/multicolor-treeview-draw-glitch – phadaphunk