【问题标题】:Haunted by C# ownerdraw treeview被 C# ownerdraw treeview 困扰
【发布时间】:2014-12-15 19:03:46
【问题描述】:

很难理解 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;
        }
    }

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

感谢您的宝贵时间。

【问题讨论】:

  • 值得注意的是,我们无法看到结果。您可能需要提供屏幕截图。否则,很好的第一个问题!
  • 糟糕,我最初的问题有图片,但因为我从来没有在这里帮助过其他人(我知道:shame blush 我会变得更好) 我不被允许上传带有问题的图片。我去尝试尽快解决这个问题。
  • 如果您发布链接,较高代表的用户通常会帮助您。

标签: c# winforms treeview


【解决方案1】:

使用TextRenderer.DrawText 而不是Graphics.DrawString 应该可以解决这个问题。 Ian Boyd 发了一条wonderful answer,讲述了两者的区别,以及为什么在自定义绘图的时候文字会看不出来。

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

【讨论】:

  • 是的,这行得通!将绘制字符串线更改为:TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds, Color.Red);显示应有的一切。我想把你的答案作为答案,但我似乎缺乏这样做的可信度。无论如何:非常感谢您帮助我,这已经困扰我太久了!
猜你喜欢
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2013-03-26
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多