C++ Builder

La Isla Bonita



TreeView with Coloured Nodes
TreeView with Coloured Nodes


Description

This example shows how to create a TTreeView component dynamically, with coloured nodes. The default colors are contained in an array. In the final application, the default colors could be changed via a color dialog. The two components in this example TreeView1 and Button1, are created dynamically.

TreeViewColors.cpp

#include <vcl.h>
#pragma hdrstop

#include "TreeView.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TTreeView* TreeView1;

const int DIM_COLORS = 11;
TColor Colors[DIM_COLORS] = { clLime,     clRed,     clBlue,
                              clGreen,    clPurple,  (TColor)0xe4bc77,
                              clFuchsia,  clMaroon,  (TColor)0x995915,
                              (TColor)0x009977,      clTeal            };

enum NodeIndex
{
    VEHICLE = 1,
    AIR_VEHICLE,
    LAND_VEHICLE,
    WATER_VEHICLE,
    AIR_VEHICLE_MAN,
    AIR_VEHICLE_UNMAN,
    LAND_VEHICLE_MAN,
    LAND_VEHICLE_UNMAN,
    WATER_VEHICLE_MAN,
    WATER_VEHICLE_UNMAN,
    TOTAL_NODES = WATER_VEHICLE_UNMAN,
};

TTreeNode* gNode[TOTAL_NODES];


__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    //Create a TTreeView Component: TreeView1
    TreeView1 = new TTreeView( this );
    TreeView1->Parent = this;
    TreeView1->Left   = 20;
    TreeView1->Top    = 10;
    TreeView1->Width  = 300;
    TreeView1->Height = 450;
    TreeView1->Color  = clBlack;
    TreeView1->OnCustomDrawItem = TreeView1CustomDrawItem;

    //Create a TButton component: Button1
    TButton* Button1 = new TButton( this );
    Button1->Parent = this;
    Button1->Left   = TreeView1->Left + TreeView1->Width + 150;
    Button1->Top    = TreeView1->Top;
    Button1->Width  = 150;
    Button1->Height = 50;
    Button1->Caption = "Show Tree View";
    Button1->OnClick = Button1Click;
}
//-----------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

  TreeView1->Items->Clear(); // remove any existing nodes

  //Add the root
  TreeView1->Items->Add(NULL, "Vehicle");
  //Add node (gNode[1]) to the root: Vehicle
  gNode[VEHICLE] = TreeView1->Items->Item[0];

  //AIR -----------------------------------------------------------
  TreeView1->Items->AddChild( gNode[VEHICLE],"Air Vehicle");
  //Add node to Air Vehicle
  gNode[AIR_VEHICLE] = TreeView1->Items->Item[1];
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE],"Air Manned" );
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE],"Air Unmanned" );

  //Add node to Air Vehicle-Manned
  gNode[AIR_VEHICLE_MAN] = TreeView1->Items->Item[2];
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Airplane" );
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Baloon" );
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Helicopter" );

  //Add node to Air Vehicle-Unmanned:
  gNode[AIR_VEHICLE_UNMAN] = TreeView1->Items->Item[6];
  TreeView1->Items->AddChild( gNode[AIR_VEHICLE_UNMAN],
                                    "Remote Controlled airplane" );


  //LAND ----------------------------------------------------------
  TreeView1->Items->AddChild( gNode[VEHICLE],"Land Vehicle");
  //Add node Land Vehicle
  gNode[LAND_VEHICLE] = TreeView1->Items->Item[8];
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE],"Land Manned" );
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE],"Land Unmanned" );

 //Add node to Land Vehicle-Manned
  gNode[LAND_VEHICLE_MAN] = TreeView1->Items->Item[9];
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Automobile" );
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Bus" );
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Truck" );
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Train" );

  //Add node to Land Vehicle-Unmanned:
  gNode[LAND_VEHICLE_UNMAN] = TreeView1->Items->Item[14];
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_UNMAN],"Robot Lander" );
  TreeView1->Items->AddChild( gNode[LAND_VEHICLE_UNMAN],"Remote controlled vehicle" );

  //WATER ----------------------------------------------------------
  TreeView1->Items->AddChild( gNode[VEHICLE],"Water Vehicle");
  //Add node Water Vehicle
  gNode[WATER_VEHICLE] = TreeView1->Items->Item[17];
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE],"Water Manned" );
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE],"Water Unmmaned" );

  //Add node to Water Vehicle-Manned:
  gNode[WATER_VEHICLE_MAN] = TreeView1->Items->Item[18];
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE_MAN],"Boat" );
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE_MAN],"Ship" );

  //Add node to Water Vehicle-Unmanned:
  gNode[WATER_VEHICLE_UNMAN] = TreeView1->Items->Item[21];
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE_UNMAN],"Remote controlled sub" );
  TreeView1->Items->AddChild( gNode[WATER_VEHICLE_UNMAN],
                                    "Remote controlled boat" );
}
//-------------------------------------------------------------

void __fastcall TForm1::TreeView1CustomDrawItem( TCustomTreeView *Sender,
      TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw )
{
//
    TCanvas *pCanvas = TreeView1->Canvas;
    TreeView1->Canvas->Font->Color = clGray;

    for ( int i=1; i <= TOTAL_NODES; i++ )
    {
        if ( Node == gNode[i] )
        {
            //It is one of the gNodes
            TreeView1->Canvas->Font->Color = Colors[i];
        }
        else
        {
            //It is not a gNode
            if ( State.Contains( cdsSelected ) )
            {
                TreeView1->Canvas->Font->Color  = clWhite;
                TreeView1->Canvas->Brush->Color = clBlue;
            }

        }
    }
}
//-------------------------------------------------------------

TreeViewColors.h

#ifndef TreeViewH
#define TreeViewH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall TreeView1CustomDrawItem(TCustomTreeView *Sender,
                                                TTreeNode *Node,
                                                TCustomDrawState State,
                                                bool &DefaultDraw);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Homepage

Copyright © 1997-2002 Rodolfo A. Frino. All rights reserved.