首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在TVirtualStringTree中绘制特定级别的背景色

如何在TVirtualStringTree中绘制特定级别的背景色
EN

Stack Overflow用户
提问于 2018-04-01 03:04:34
回答 2查看 828关注 0票数 4

我试图在VirtualStringTree的所有特定级别使用背景颜色绘制一个高行文本。它看起来像为所有相同级别选定的节点。下面的代码不起作用。请有人指点一下。

代码语言:javascript
运行
复制
procedure TMainForm.Tree1PaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
var  Data: PNodeData;LEVEL:INTEGER;  tree1node,tree4Node: PVirtualNode;
begin 
    Data := Tree1.GetNodeData(Node);
    Level := tree1.GetNodeLevel(node);

 case column of
     0:begin
        if Level = 0 then BEGIN
               TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
               TargetCanvas.Font.Color :=CLyellow;
               targetcanvas.Brush.Color :=clgreen;//don't work
               targetcanvas.Brush.Style :=bssolid;     

             END;
            if  Level = 1 then BEGIN
                  TargetCanvas.Font.Color :=CLaqua; 
                  targetcanvas.Brush.Color :=clgreen;
            end;
       end;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-01 03:12:08

VT更快地在PrepareCell方法中填充单元格背景,以便更具体。因此,设置画布刷的尝试为时已晚。尝试从OnBeforeCellPaint事件填充节点矩形:

代码语言:javascript
运行
复制
procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  R: TRect;
begin
  if CellPaintMode = cpmPaint then
  begin
    R := Sender.GetDisplayRect(Node, Column, True, False, True);
    R.Offset(0, -R.Top);
    case Sender.GetNodeLevel(Node) of
      0: TargetCanvas.Brush.Color := $0000F9FF;
      1: TargetCanvas.Brush.Color := $0000BFFF;
      2: TargetCanvas.Brush.Color := $000086FF;
    end;
    TargetCanvas.FillRect(R);
  end;
end;

预览:

票数 5
EN

Stack Overflow用户

发布于 2018-04-01 07:50:06

一种方法是在eaColor事件中使用OnBeforeItemErase作为擦除操作:

代码语言:javascript
运行
复制
procedure TMainForm.Tree1BeforeItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
          Node: PVirtualNode; ItemRect: TRect; var ItemColor: TColor; var EraseAction: TItemEraseAction);
begin
   if not Sender.Selected[Node] then begin
      case Sender.GetNodeLevel(Node) of
        0: ItemColor := clgreen;
        1: ItemColor := clAgua;
      end;
      EraseAction := eaColor;
   end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49594402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档