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


Автор: Clio 2.2.2016, 12:27
 Добрый день!

В  TVirtualStringTree LineMode = lmBands я закрашиваю разные ноды разными цветами в  OnBeforeCellPaint, но при этом у меня на закрашивается вертикальная полоса
этого нода, а только горизонтальная.
Подскажите, пожалуйста, как можно закрасить и вертикальную полосу нода ? 

 

Автор: kami 2.2.2016, 21:49
Понятно, что код достаточно простой. Но приведите его, пожалуйста

Автор: Clio 3.2.2016, 11:27
   -----------------------------
   |   -------------------------- Цвет 1 
   |  |   ----------------------- Цвет 2
   |  |   |


 Я попытался нарисовать , как выглядит дерево в режиме  LineMode = lmBands.
 При закраски в event  OnBeforeCellPaint закрашивается только горизонтальная часть полоски а вертикальная остается цветом по-умолчанию.
 Может надо в другой event писать ?
Код

procedure Tfm.vtBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect;
  var ContentRect: TRect);
var
  NodeData : PvtExpertRec;
  pr: TVarItem;
begin
  if   Node.ChildCount >0 then 
  begin
      TargetCanvas.Brush.Color:= $00C0E6EE;
  end;

  TargetCanvas.FillRect(CellRect);

end;



Автор: kami 3.2.2016, 22:23
Что-то моя телепатия отдыхает.
Ваш вариант закрашивает строку полностью нужным цветом - от крайнего левого до крайнего правого пикселя. Судя по вашему описанию - это именно то, что вы и хотите получить.
http://postimg.org/image/52wsjiydp/

Однако, возможно что результат должен быть таким:
http://postimg.org/image/txgadlj7x/

Какой из рисунков правильный?

Автор: Clio 4.2.2016, 15:00
Добрый день!

Должно быть как на рисунке 2, а получается как на 1.

Автор: kami 4.2.2016, 19:29
Из вашего описания это было не очевидно. Только включение ментальных способностей помогло выяснить, что именно нужно smile

Код

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect;  var ContentRect: TRect);

  function GetNodeColorByLevel(Level: Integer): Integer;
  begin
    case Level of
      0:
        Result := $00C0E6EE;
      1:
        Result := $00BFEEEC;
      2:
        Result := $00BFEEC9;
      3:
        Result := $00EEE6BF;
      4:
        Result := $00EEC0BF;
      5:
        Result := $00EDBFEE;
    end;
  end;

var
  NodeLevel: Integer;
  ParentRect: TRect;
begin
  // закрашиваем содержимое ячейки с текстом
  NodeLevel := Sender.GetNodeLevel(Node);
  TargetCanvas.Brush.Color := GetNodeColorByLevel(NodeLevel);
  TargetCanvas.FillRect(ContentRect);

  // начинаем закрашивать часть левее от текста
  // подготавливаем исходные координаты, "первый левый" участок
  // должен быть одного цвета с текстом.
  ParentRect := CellRect;
  ParentRect.Right := ContentRect.Left;
  ParentRect.Left := ParentRect.Right - TVirtualStringTree(Sender).Indent - TVirtualStringTree(Sender).Margin;

  for NodeLevel := NodeLevel downto 0 do
    begin
      TargetCanvas.Brush.Color := GetNodeColorByLevel(NodeLevel);

      TargetCanvas.FillRect(ParentRect);
      // смещаем квадрат закрашивания на один уровень влево.
      ParentRect.Right := ParentRect.Left;
      ParentRect.Left := ParentRect.Left - TVirtualStringTree(Sender).Indent;
    end;
end;

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