VirtualTreeView-другой цвет текста в одном узле

Я пытаюсь создать представление в TVirtualStringTree, который будет похож на что-то вроде этого:

Folder view with different font colors

в приведенном выше примере я показал некоторые из возможных сценариев, которые я хочу достичь. FolderA имеет полужирный текст и после этого красного цвета, незакрепленный текст сразу за ним в том же узле. Я ищу способ сделать такой вывод.

однако, если это слишком сложно или слишком проблематично для создания, я был бы доволен FolderB или FolderC тип вывода-который, вероятно, может быть выполнен с 2 столбцами, один из которых содержит имя папки, а другой-количество файлов внутри.

FolderD здесь так же, как пример папки без файлов и вывода для этой папки (текст распакован и нет номера).

Я ищу любые направления, как сделать этот эффект, поскольку кажется, что VirtualTreeView может иметь только один цвет или полужирный шрифт на один узел. Любые советы или предложения, как двигаться в направлении FolderA или FolderB или FolderC высоко ценится, поэтому у меня есть отправная точка. Примеры Delphi или C++ Builder приветствуются (окончательный код будет в C++ Builder).

1 ответов


вы можете просто использовать toShowStaticText (StringOptions) параметр:

implementation

type
  PNodeRec = ^TNodeRec;
  TNodeRec = record
    Name: WideString;
    Count: Integer;
    IsBold: Boolean;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Node: PVirtualNode;
  NodeRec: PNodeRec;
  I: Integer;
begin
  VirtualStringTree1.TreeOptions.StringOptions := 
    VirtualStringTree1.TreeOptions.StringOptions + [toShowStaticText];
  VirtualStringTree1.NodeDataSize := Sizeof(TNodeRec);
  // Populate some data
  for I := 1 to 10 do
  begin
    Node := VirtualStringTree1.AddChild(nil);
    NodeRec := VirtualStringTree1.GetNodeData(Node);
    Initialize(NodeRec^);
    NodeRec.Name := 'Node' + IntToStr(I);
    NodeRec.Count := I;
    NodeRec.IsBold := I mod 2 = 0;
  end;
end;

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  NodeRec: PNodeRec;
begin
  NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node));
  if TextType = ttNormal then
    CellText := NodeRec^.Name
  else // ttStatic
    CellText := Format('(%d)', [NodeRec^.Count]);
end;

procedure TForm1.VirtualStringTree1PaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var
  NodeRec: PNodeRec;
begin
  NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node));
  if TextType = ttNormal then
  begin
    if NodeRec^.IsBold then
      TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
  end
  else // ttStatic
    TargetCanvas.Font.Color := clRed;
end;

выход:

enter image description here