我的软件中用TTreeView构建一棵树,其中二级节点数量较多,且存在多种状态,现在希望对每种状态使用一种颜色进行区分,以使用户在界面上可以对节点的状态一览无余,但我现在没有找到如何实现节点着色,因此请做过的大侠指点一二!我的环境是D7

解决方案 »

  1.   

    procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      FRect: TRect;
      FColor: TColor;
    begin
      FRect := Node.DisplayRect(True);
      case Node.Level of
        0: FColor := clYellow;
        1: FColor := clRed;
        2: FColor := clBlue;
      end;
      with Sender.Canvas do
      begin
        Pen.Color := clPurple;
        Brush.Color := FColor;
        Brush.Style := bsSolid;
        TextOut(FRect.Left + 2, FRect.Top + 2, Node.Text);
      end;
    end;
      

  2.   

    budded的方法确实很好
    我想继续请教两个问题
    1.这个方法是响应什么事件,或者说什么时候被调用
    2.现在Tree中的所有节点都在一个数组中,包括需要现实的信息和状态,我希望通过遍历数组构造树的过程中,每添加一个节点就对其着色,另外我目前是使用自定义的一个函数Tree_Show在界面上画出这棵树,因为在我的应用中,这棵树的状态属于变化很频繁的,需要经常重画(当然树上的节点数目很少,一般一级节点1个,二级节点最多35个,效率不是问题)
      

  3.   

    哈,我已经查了一下资料,在每个Node被显示之前调用TreeView1CustomDrawItem事件响应函数,但如果我是在自定义的一个Tree_Show中使用For循环调用AddChild方法在树上添加节点,那么该事件的调用是在For循环内部,每次AddChild之后,还是在整棵树画出来之前呢?
    另此时TreeView1CustomDrawItem事件只知道该节点的信息,而FColor的获得取决于该节点的另外一个信息
    或者更准确地说:每个节点对应一个结构,该结构有两个元素,Discription元素为String类型,显示在树上,Flag元素为Integer类型,Flag决定颜色,Flag取0为黑色,取1为蓝色,取2为红色,此时如何把Flag信息带进TreeView1CustomDrawItem事件响应函数呢?
      

  4.   

    经过实验,我已经知道何时调用该方法了
    但还是不知道如何把Flag信息传进去做为确定文字色彩的依据
    另外,从实现来说,每个节点出现了一个底色框,这时我不需要的,我希望底色不变,仅仅是文字色彩变化
      

  5.   

    另外还请问一下,除了调色外,应该有办法改变文字的font和大小吧,该如何实现呢?
      

  6.   

    Sender.Canvas这个属性下面有好多属性,去看一就有了。就Font属性的。
      

  7.   

    问题已经解决,只用了一句话
    Node.TreeView.Canvas.Font.Color:=FColor
    不过还是非常感谢Budded和oushengfen给我的启发,点数将立即奉献
    再次表示感谢