更改 TVirtualStringTree 中单元格的背景颜色

Change background color of cells in a TVirtualStringTree

I was seeing this code 并且,通过逻辑调整,它非常适合我在 BCB 6 中的应用程序,但我想知道如何更改单元格的背景颜色。当我使用 TListView 时,我使用 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;
}

但是我已经验证了Sender->Canvas->Brush->Color产生编译错误('TCustomControl: Canvas'无法访问)并且使用TargetCanvas->Brush- > 颜色不产生任何结果。

TVirtualStringTree 使用一组相当不同的程序来绘制树的单元格。如果查看帮助,您会发现每个单元格都会发生多个事件。您可能感兴趣的是:

OnBeforeCellPaint
OnPaintText
OnDrawText

OnBeforeCellPaint()提供CellRect参数,可用于填充整个背景,包括树展开符号和最终节点图像,或者,使用ContentRect,不包括树展开符号 space,

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

然后用OnPaintText()绘制文字

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

或者,只有 OnDrawText() 可能更容易使用,您可以在其中填充文本背景(但不包括树展开符号和图像)并绘制文本

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

顺便说一句,我建议查看 dl 包中的帮助文件,以了解有关绘制树的更多详细信息。 Paint Cycles and Stages 一章的开头是:Virtual Treeview 中最复杂的过程无疑是它的绘画。在此处阅读 Virtual Treeview 在绘制过程中进入的阶段以及如何自定义此过程。