How to color mix cells with background image in VirtualTreeView?

I use VT.Background to display a background image in VT with multiple columns.
But I can’t find a way to use different colors for the cells, because they hide the background image.

I tried using OnBeforeItemErase , but if I use EraseAction := eaColor , the area of ​​the bitmap in the cell will also be colored, if I use eaDefault , the color does not apply.

Any idea how this can be done?

+6
delphi delphi-7 virtualtreeview tvirtualstringtree
source share
1 answer

Just trying to guess if this is what you are looking for:

Update:
Added color mixing function for processors without MMX.

 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 := $000080FF; 1: BlendColor := $0046C2FF; 2: BlendColor := $0046F5FF; 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; 

Preview code above:

enter image description here

+18
source share

All Articles