被C#ownerdraw treeview所困扰

时间:2014-12-15 19:03:47

标签: c# winforms treeview

很难理解ownerdraw树视图,这里有完整的故事:

VS2013 WinForms应用程序(在Windows 8.1上运行,如果重要的话启用了TrueType),其树视图为:DrawMode = OwnerDrawText;

在表单加载中,一些节点被添加到树视图中:

   private void Form1_Load(object sender, EventArgs e)
    {
        // add some nodes
        for (int i = 0; i < 20; i++)
        {
           TreeNode treeNode = treeView1.Nodes.Add(new String('i', 60));
           treeNode.Tag = i;
        }
    }

接下来,我自己绘制每个其他节点以显示问题:

    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        // use ownerdraw every other item
        if ((int)(e.Node.Tag) % 2 == 0)
        { 
            Font font = e.Node.NodeFont;
            if (font == null) font = e.Node.TreeView.Font;
            e.Graphics.DrawString(e.Node.Text, font, Brushes.Red, e.Bounds.X, e.Bounds.Y);
        }
        else
        {
            e.DrawDefault = true;
        }
    }

查看结果,请注意所有者绘制的(红色)项目节点之间的字符间距与树视图绘制自己的节点时的间距不同。过了一会儿,间距突然变化了。我在这里使用错误的字体吗?我错过了一些明显的东西吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:8)

使用TextRenderer.DrawText代替Graphics.DrawString可以解决此问题。 Ian Boyd发布了一个wonderful answer关于两者之间的差异以及为什么在进行自定义绘图时文本可以查看的内容。

我打算在这里引用他的一部分答案,但实际上如果你做自定义绘图,你真的应该阅读整个答案,因为在绘制文本时它的每一部分都很重要 - 特别是在绘制一部分时控件上的文本,而不是自己完成所有绘图。