Change background color of cells in a TVirtualStringTree

450 Views Asked by At

I was seeing this code and, with the logical adaptations, it suits me perfectly for my application in BCB 6 but I would like to know how I could do to change the background color of the cells. When I do it with a TListView I use the Brush property of the Canvas:

void __fastcall TForm1 :: ListView1CustomDrawItem (TCustomListView * Sender, TListItem * Item, TCustomDrawState State, bool & DefaultDraw)
{
      Sender-> Canvas-> Brush-> Color = clWhite;
      Sender-> Canvas-> Font-> Color = clBlack;
      Sender-> Canvas-> Font-> Style = TFontStyles () >> fsBold;
}

But I have verified that Sender-> Canvas-> Brush-> Color generates a compilation error ('TCustomControl: Canvas' is not accessible) and using TargetCanvas-> Brush-> Color does not produce any results.

2

There are 2 best solutions below

4
Tom Brunberg On BEST ANSWER

The TVirtualStringTree uses a rather different set of procedures for painting the cells of the tree. If you look in the help you will find that there are several events occuring for each cell. The ones you probably are interested in are:

OnBeforeCellPaint
OnPaintText
OnDrawText

OnBeforeCellPaint() provides the CellRect parameter, which you can use to fill the whole background, including tree expand symbol and eventual node image, or, using ContentRect, excluding tree expand symbol space,

procedure TForm1.VSTBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);

and then use OnPaintText() to draw the text

procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);

Alternatively, maybe easier to use only OnDrawText() in which you can both fill the text background (but, excluding tree expand symbol and image) and draw the text

procedure TForm1.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; const Text: string;
  const CellRect: TRect; var DefaultDraw: Boolean);

Btw, I recommend looking at the help file in the dl package, for further details regarding painting the tree. The chapter Paint Cycles and Stages starts with this: The most complex process in Virtual Treeview is without doubts its painting. Read here what stages Virtual Treeview enters during paint and how you can customize this process.

0
gwideman On

In case others stumble on this question, please see the Help file page "Paint cycles and stages". This lays out all the steps in cell painting. With respect to the current question specifically, that page describes OnBeforeItemErase "This stage and its associated event is usually used to give the node a different background color or erase the background with a special pattern which is different to what the tree would draw." This affects the entire row (node). To set background color for a specific cell, use BeforeCellPaint.