Как окрашивать ячейки смешивания с фоновым изображением в VirtualTreeView?

Я использую VT.Фон для отображения фонового изображения в VT с несколькими столбцами.
Но я не могу найти способ использовать разные цвета для ячеек, потому что они скрывают фоновое изображение.

Я пробовал использовать OnBeforeItemErase но если я используюEraseAction := eaColor область растрового изображения фона в ячейке также окрашивается, если я использую eaDefault цвет не применяется.

есть идеи, как это можно сделать?

1 ответов


просто попытка угадать, если это то, что вы ищете:

обновление:
Добавлена функция смешивания цветов для не MMX CPU машин.

procedure ColorBlend(const ACanvas: HDC; const ARect: TRect;
  const ABlendColor: TColor; const ABlendValue: Integer);
var
  DC: HDC;
  Brush: HBRUSH;
  Bitmap: HBITMAP;
  BlendFunction: TBlendFunction;
begin
  DC := CreateCompatibleDC(ACanvas);
  Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left,
    ARect.Bottom - ARect.Top);
  Brush := CreateSolidBrush(ColorToRGB(ABlendColor));
  try
    SelectObject(DC, Bitmap);
    Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top), Brush);
    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.BlendFlags := 0;
    BlendFunction.AlphaFormat := 0;
    BlendFunction.SourceConstantAlpha := ABlendValue;
    Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction);
  finally
    DeleteObject(Brush);
    DeleteObject(Bitmap);
    DeleteDC(DC);
  end;
end;

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  BlendColor: TColor;
  BlendValue: Integer;
begin
  if CellPaintMode = cpmPaint then
  begin
    case Column of
      0: BlendColor := 0080FF;
      1: BlendColor := 46C2FF;
      2: BlendColor := 46F5FF;
    end;
    BlendValue := 145;
    if not VirtualTrees.MMXAvailable then
      ColorBlend(TargetCanvas.Handle, CellRect, BlendColor, BlendValue)
    else
      VirtualTrees.Utils.AlphaBlend(0, TargetCanvas.Handle, CellRect, Point(0, 0),
        bmConstantAlphaAndColor, BlendValue, ColorToRGB(BlendColor));
  end;
end;

предварительный просмотр код:

enter image description here