如何使用TreeViewDrawMode.OwnerDrawAll改变选定节点的背景颜色的TreeView? [英] How to change background color of selected node in TreeView using TreeViewDrawMode.OwnerDrawAll?

查看:775
本文介绍了如何使用TreeViewDrawMode.OwnerDrawAll改变选定节点的背景颜色的TreeView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要改回选择的节点,颜色时选择的节点和具有焦点 - 背景色进行绿色选择时,但没有焦点 - 红色。我不能让重点是树视图和没有选择的节点之间的差异。位于TabPage的对象树视图。

  // ...
this.myTreeView.HideSelection = FALSE;
// ...
私人无效myTreeView_drawNode(对象发件人,DrawTreeNodeEventArgs E)
{
      颜色backColorSelected = System.Drawing.Color.Green;
      色背景色= System.Drawing.Color.Red;
      //节点选择与具有焦点
      如果(((e.State&安培;!TreeNodeStates.Selected)= 0)
      &功放;&安培; (this.myTabControl.Focused))//这不工作,节点总是冲
      {
          使用(SolidBrush刷=新SolidBrush(backColorSelected))
          {
              e.Graphics.FillRectangle(刷,e.Bounds);
          }
      }
      //选择的节点,但是没有焦点
      否则如果((e.State&安培;!TreeNodeStates.Selected)= 0)
      {
          使用(SolidBrush刷=新SolidBrush(背景色))
          {
             e.Graphics.FillRectangle(刷,e.Bounds);
          }
      }
      //没有选择可言
      其他
      {
          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);
}
 

解决方案

只要检查该节点的属性,它的工作原理(测试)。此外,我建议缓存任何自定义画笔,你喜欢做以下。(当然你也可以使用Brushes.Red和Brushes.Green)

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

    私人无效myTreeView_drawNode(对象发件人,DrawTreeNodeEventArgs E)
    {
        如果(e.Node.IsSelected)
        {
            如果(treeView1.Focused)
                e.Graphics.FillRectangle(greenBrush,e.Bounds);
            其他
                e.Graphics.FillRectangle(redBrush,e.Bounds);
        }
        其他
            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);
    }
 

P.S。你可能需要渲染你单击展开节点等东西。

I need to change back colours of selected nodes, when node selected and has focus - back color make green, when selected but doesn't have focus - red. I can't make the difference between selected node with focus on tree view and without. Tree view located in TabPage object.

//...
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);
}   

解决方案

Just check the node's property, it works (tested). Also I suggest caching any custom brushes you make like the following.. (Of course you can also use Brushes.Red and 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);
    }

P.S. You'll probably need to render something that you click to expand nodes etc.

这篇关于如何使用TreeViewDrawMode.OwnerDrawAll改变选定节点的背景颜色的TreeView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆