【问题标题】:Change background color of cells in a TVirtualStringTree更改 TVirtualStringTree 中单元格的背景颜色
【发布时间】:2020-02-02 17:18:02
【问题描述】:

I was seeing this code 并且通过逻辑调整,它非常适合我在 BCB 6 中的应用,但我想知道如何更改单元格的背景颜色。当我使用 TListView 执行此操作时,我使用 Canvas 的 Brush 属性:

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

【问题讨论】:

    标签: canvas c++builder c++builder-6 tvirtualstringtree


    【解决方案1】:

    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);
    

    或者,也许更容易使用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 中最复杂的过程无疑是它的绘画。在此处阅读虚拟树视图在绘制过程中进入哪些阶段以及如何自定义此过程。

    【讨论】:

    • 感谢您的帮助。我将研究最佳解决方案。只有一个精度:TVirtualStringTree 中不存在 OnDrawText 事件。
    • 哦,也许您使用的是旧版本? (不过,我不知道OnDrawText 的历史)。无论如何,据说我正在使用的版本是 6.2.5(VirtualTrees.pas 的第 80 行)。在typedef TCustomVirtualStringTree inherited; 下查看VirtualTrees.hpp 有一个已发布的__property OnDrawText;
    • 感谢您的回答。我想我正在使用最新版本的组件,并且由于您使用 OnBeforeCellPait 事件的建议,我找到了解决方案。
    • @Angel,然后请尝试考虑accepting this answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2013-04-12
    • 2021-10-31
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多