Изменить цвет фона ячеек в TVirtualStringTree - PullRequest
1 голос
/ 04 октября 2019

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

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 не производитлюбые результаты.

1 Ответ

1 голос
/ 04 октября 2019

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, без сомнения, является его рисование. Прочтите здесь, какие этапы вступает в Virtual Treeview во время рисования и как вы можете настроить этот процесс.

...