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

Canvas 更改TVirtualStringTree中单元格的背景色,canvas,c++builder,c++builder-6,tvirtualstringtree,Canvas,C++builder,C++builder 6,Tvirtualstringtree,而且,通过逻辑调整,它非常适合我在BCB 6中的应用,但我想知道如何更改单元格的背景颜色。使用TListView时,我使用画布的笔刷属性: void __fastcall TForm1 :: ListView1CustomDrawItem (TCustomListView * Sender, TListItem * Item, TCustomDrawState State, bool & DefaultDraw) {       Sender-> Canvas-> Brush

而且,通过逻辑调整,它非常适合我在BCB 6中的应用,但我想知道如何更改单元格的背景颜色。使用TListView时,我使用画布的笔刷属性:

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->Color不会产生任何结果。

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

OnBeforeCellPaint
OnPaintText
OnDrawText
OnBeforeCellPaint()
提供了
CellRect
参数,可用于填充整个背景,包括树展开符号和最终节点图像,或使用
ContentRect
排除树展开符号空间

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);
procedure TForm1.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; const Text: string;
  const CellRect: TRect; var DefaultDraw: Boolean);
或者,只使用
OnDrawText()
可能更容易,您可以在其中填充文本背景(但不包括树展开符号和图像)并绘制文本

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

顺便说一句,我建议查看dl包中的帮助文件,以了解有关绘制树的更多详细信息。“绘制周期和阶段”一章从以下内容开始:虚拟树视图中最复杂的过程无疑是它的绘制。在此阅读Virtual Treeview在绘制过程中进入的阶段以及如何自定义此过程。

感谢您的帮助。我将研究最佳解决方案。只有一个精度:OnDrawText事件在TVirtualStringTree中不存在。哦,也许您使用的是旧版本?(不过,我不知道绘图文本的历史)。无论如何,我正在使用的版本据说是6.2.5(VirtualTrees.pas的第80行)。查看
typedef TCustomVirtualStringTree下的
VirtualTrees.hpp
在DrawText上有一个已发布的
\u属性谢谢你的回答。我想我正在使用最新版本的组件,我找到了解决方案,感谢您的建议使用OnBeNePulePaIT事件。@天使,然后尝试考虑,请。