Изменить цвет фона ячеек в TVirtualStringTree

я видел этот код и с логическим адаптации, он идеально подходит для моего приложения в BCB 6, но я хотел бы знать, как я могу изменить цвет фона ячеек. Когда я делаю это с помощью TListView, я использую свойство Brush холста:

void __fastcall TForm1 :: ListView1CustomDrawItem (TCustomListView * Sender, TListItem * Item, TCustomDrawState State, bool & DefaultDraw)
{
      Sender-> Canvas-> Brush-> Color = clWhite;
      Sender-> Canvas-> Font-> Color = clBlack;
      Sender-> Canvas-> Font-> Style = TFontStyles () >> fsBold;
}

Но я проверил, что Sender-> Canvas-> Brush-> Color генерирует ошибку компиляции («TCustomControl: Canvas» недоступен), а использование TargetCanvas-> Brush-> Color не дает никаких результатов.


person Angel Matilla Candás    schedule 04.10.2019    source источник


Ответы (1)


TVirtualStringTree использует несколько иной набор процедур для рисования ячеек дерева. Если вы заглянете в справку, то обнаружите, что для каждой ячейки происходит несколько событий. Те, которые вас, вероятно, заинтересуют:

OnBeforeCellPaint
OnPaintText
OnDrawText

OnBeforeCellPaint() предоставляет параметр CellRect, который можно использовать для заполнения всего фона, включая символ расширения дерева и возможное изображение узла, или, используя ContentRect, исключая пространство символа расширения дерева,

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

а затем используйте OnPaintText(), чтобы нарисовать текст

procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);

В качестве альтернативы, возможно, проще использовать только OnDrawText(), в котором вы можете как заполнять фон текста (но, исключая символ расширения дерева и изображение), так и рисовать текст

procedure TForm1.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; const Text: string;
  const CellRect: TRect; var DefaultDraw: Boolean);

Кстати, я рекомендую посмотреть файл справки в пакете dl, чтобы узнать больше о рисовании дерева. Глава Циклы и этапы рисования начинается со следующего: Самым сложным процессом в виртуальном дереве, без сомнения, является его рисование. Прочтите здесь, какие этапы проходит Virtual Treeview во время рисования и как вы можете настроить этот процесс.

person Tom Brunberg    schedule 04.10.2019
comment
Спасибо за вашу помощь. Я рассмотрю лучшее решение. Только одна точность: событие OnDrawText не существует в TVirtualStringTree. - person Angel Matilla Candás; 05.10.2019
comment
О, может быть, вы используете более старую версию? (Хотя я не знаю историю OnDrawText). Во всяком случае, версия, с которой я работаю, называется 6.2.5 (строка 80 VirtualTrees.pas). Глядя на VirtualTrees.hpp под typedef TCustomVirtualStringTree inherited; есть опубликованный __property OnDrawText; - person Tom Brunberg; 05.10.2019
comment
Спасибо за ответы. Я думаю, что использую последнюю версию компонента, и я нашел решение благодаря вашим предложениям, используя событие OnBeforeCellPait. - person Angel Matilla Candás; 05.10.2019
comment
@Ангел, тогда попробуй рассмотреть принятие этого ответа, пожалуйста. - person TLama; 09.11.2019