【问题标题】:How to change background color of selected node in TreeView using TreeViewDrawMode.OwnerDrawAll?如何使用 TreeViewDrawMode.OwnerDrawAll 更改 TreeView 中选定节点的背景颜色?
【发布时间】:2012-10-04 21:10:58
【问题描述】:

我需要更改选定节点的背景颜色,当节点被选中并有焦点时 - 背景颜色变为绿色,当被选中但没有焦点时 - 红色。我无法区分关注树视图和不关注树视图的选定节点。位于 TabPage 对象中的树视图。

//...
this.myTreeView.HideSelection = false;
//...
private void myTreeView_drawNode(object sender, DrawTreeNodeEventArgs e)
{
      Color backColorSelected = System.Drawing.Color.Green;
      Color backColor = System.Drawing.Color.Red;
      // node selected and has focus
      if (((e.State & TreeNodeStates.Selected) != 0) 
      && (this.myTabControl.Focused)) // this doesn't work, node is always red
      {
          using (SolidBrush brush = new SolidBrush(backColorSelected))
          {
              e.Graphics.FillRectangle(brush, e.Bounds);
          }
      }
      // node selected but doesn't have focus
      else if ((e.State & TreeNodeStates.Selected) != 0)
      {
          using (SolidBrush brush = new SolidBrush(backColor))
          {
             e.Graphics.FillRectangle(brush, e.Bounds);
          }
      }
      // not selected at all
      else
      {
          e.Graphics.FillRectangle(Brushes.White, e.Bounds);
      }

      e.Graphics.DrawRectangle(SystemPens.Control, e.Bounds);

      TextRenderer.DrawText(e.Graphics,
                             e.Node.Text,
                             e.Node.TreeView.Font,
                             e.Node.Bounds,
                             e.Node.ForeColor);
}   

【问题讨论】:

  • myTreeView.Focused代替this.myTabControl.Focused怎么样?
  • @aliassce,这也行不通
  • 只是想让您知道您的代码非常适合我需要做的事情。感谢您发布它。
  • 您要确保控件上的 DrawMode 也设置为 OwnerDrawAll。

标签: c# .net winforms


【解决方案1】:

只需检查节点的属性,它就可以工作(经过测试)。另外我建议缓存您制作的任何自定义画笔,如下所示..(当然您也可以使用 Brushes.Red 和 Brushes.Green)

SolidBrush greenBrush = new SolidBrush(Color.Green);
    SolidBrush redBrush = new SolidBrush(Color.Red);

    private void myTreeView_drawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (e.Node.IsSelected)
        {
            if (treeView1.Focused)
                e.Graphics.FillRectangle(greenBrush, e.Bounds);
            else
                e.Graphics.FillRectangle(redBrush, e.Bounds);
        }
        else
            e.Graphics.FillRectangle(Brushes.White, e.Bounds);

        e.Graphics.DrawRectangle(SystemPens.Control, e.Bounds);

        TextRenderer.DrawText(e.Graphics,
                               e.Node.Text,
                               e.Node.TreeView.Font,
                               e.Node.Bounds,
                               e.Node.ForeColor);
    }

附:您可能需要渲染一些您单击以展开节点等的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多