Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вопрос по Virtual Treeview


Автор: Caduser 3.10.2006, 01:27
Отличный компонент TVirtualStringTree, часто его использую. Возникла необходимость "нарисовать" не стандартное дерево:
- у каждого узла этого дерева может быть не одна иконка, а несколько (от 1 до 3-х). Дополнительные иконки рисую в AfterItemPaint:

Код

// рисуем дополнительные иконки узла
procedure TForm1.VSTAfterItemPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
  R: TRect;
  BitMap1, BitMap2 : TBitMap;
  Data: pNodeData;
begin
  Data  := Sender.GetNodeData(Node);

  R := ItemRect;
  with TargetCanvas do
   begin
      BitMap1 := TBitMap.Create;
      BitMap2 := TBitMap.Create;
      try
        Inc( R.Left, VST.Indent+16 + (Sender.GetNodeLevel(Node) * VST.Indent) );
        ImageList1.GetBitmap(Data.IconIndex1, BitMap1);
        ImageList2.GetBitmap(Data.IconIndex2, BitMap2);
        Draw(R.Left+1, R.Top, BitMap1);
        Draw(R.Left+16+2, R.Top, BitMap2);
      finally
        BitMap1.Free;
        BitMap2.Free;
      end;
    end;
end;

// текст узла
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Data: pNodeData;
begin
  Data  := Sender.GetNodeData(Node);
  CellText := Data.Text;
end;

иконки рисуются нормально, но текст вместе с выделением оказывается под этими иконками, т.е. необходимо как то смещать текст вправо, на расстояние которое зависит от числа иконок в узле. 
Прошу помощи, в решении этой задачки!


Автор: artem1987 3.10.2006, 14:43
добавляй пустые иконки там (AxB)где они не нужны

Автор: Caduser 4.10.2006, 00:23
Цитата(artem1987 @ 3.10.2006,  14:43)
добавляй пустые иконки там (AxB)где они не нужны

пустые иконки нигде не нужны, соответственно добавлять их тоже никуда не нужно  smile  . 
Основной вопрос "Как смещать текст узла вправо?" или по другому "Как построить дерево представленное во вложении 1.gif ?" (используя TVirtualStringTree).

Автор: artem1987 4.10.2006, 11:51
я понял, что ты имеешь ввиду, должен быть параметр margin
просто если ты вставишь второй иконку на которой ничего нет то визуально текст узла сдвинется вправо...

Автор: Caduser 5.10.2006, 01:08
Цитата(artem1987 @ 4.10.2006,  11:51)
я понял, что ты имеешь ввиду, должен быть параметр margin

такой параметр есть - TextMargin, однако он работает не корректно, т.к. при этом выделение узла попадает под тополнительные иконки, появляется лишний "хвост" выделения, и самое главное - нельзя задать свой TextMargin для каждого узла.

Цитата(artem1987 @ 4.10.2006,  11:51)

просто если ты вставишь второй иконку на которой ничего нет то визуально текст узла сдвинется вправо...

В том то и проблема что текст самостоятельно не сдвинется вправо, его нужно как-то сдвинуть. Или может я не так вставляю дополнительные иконки?
Во вложении пример. Вопрос открыт.

Автор: Caduser 6.10.2006, 00:48
Попробовал решить проблему в TVirtualDrawTree, хотя смещать текст для каждого узла удалось, но выделение узла перекрывает дополнительные иконки, т.е. как и в TVirtualStringTree - выделение узла не смещается вправо вместе с текстом.
Во вложении пример с TVirtualDrawTree и TVirtualStringTree. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)