Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TVirtualStringTree. Закраска при lmBands. Как закрасить вертикальную полосу нода 
:(
    Опции темы
Clio
Дата 2.2.2016, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



 Добрый день!

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

 
PM MAIL   Вверх
kami
Дата 2.2.2016, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Понятно, что код достаточно простой. Но приведите его, пожалуйста
PM MAIL WWW   Вверх
Clio
Дата 3.2.2016, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



   -----------------------------
   |   -------------------------- Цвет 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;



PM MAIL   Вверх
kami
Дата 3.2.2016, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Что-то моя телепатия отдыхает.
Ваш вариант закрашивает строку полностью нужным цветом - от крайнего левого до крайнего правого пикселя. Судя по вашему описанию - это именно то, что вы и хотите получить.
user posted image

Однако, возможно что результат должен быть таким:
user posted image

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

Это сообщение отредактировал(а) kami - 3.2.2016, 22:25
PM MAIL WWW   Вверх
Clio
Дата 4.2.2016, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Добрый день!

Должно быть как на рисунке 2, а получается как на 1.
PM MAIL   Вверх
kami
Дата 4.2.2016, 19:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Из вашего описания это было не очевидно. Только включение ментальных способностей помогло выяснить, что именно нужно 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;

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.