被C#ownerdraw treeview所困扰

use*_*553 6 c# treeview winforms

很难理解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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的时间.

Ant*_*ony 8

使用TextRenderer.DrawText而不是Graphics.DrawString应该解决这个问题.Ian Boyd发布了一个很好的答案,关于两者之间的区别以及为什么在进行自定义绘图时文本会有所不同.

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