Kann sein, dass ich nicht ganz hinter dein Problem steige, aber warum veränderst du denn überhaupt den Core-Typ TVirtualNode um zusätzliche Informationen zu speichern?
Der VirtualTreeView zeichnet sich doch gerade dadurch aus, dass du durch seine virtuelle Daten- und Knotenstruktur alles mögliche an Informationen zu einem Knoten speichern kannst.
In deinem Fall würde es genügen, einen Datentyp für die Knotendaten zu haben und dann das Bild selber zu zeichnen, wenn es über eine ImageList nicht so einfach geht. Zum Beispiel:
Delphi-Quellcode:
type
TNodeData = record
Image: TBitmap;
Centered: Boolean;
end;
PNodeData = ^TNodeData;
// ...
VirtualStringTree1.NodeDataSize(SizeOf(TNodeData));
// ...
var
Node: PVirtualNode;
Data: PNodeData;
begin
Node := VirtualStringTree1.AddChild(nil);
Data := VirtualStringTree1.GetNodeData(Node);
Data^.Image := TBitmap.Create; // In OnFreeNode wieder freigeben
with Data^.Image do
begin
PixelFormat := pf24Bit;
Width := 32;
Height := 32;
with Canvas do
begin
Brush.Color := clSkyBlue;
Brush.Style := bsSolid;
FillRect(ClipRect);
end;
end;
Data^.Centered := TRUE; // FALSE ...
end;
procedure TForm1.VirtualStringTree1AfterCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; CellRect: TRect);
var
X, Y: Integer;
Data: PNodeData;
begin
// Bild zB nur in die 2. Spalte zeichnen
if Column <> 1 then
Exit;
Data := Sender.GetNodeData(Node);
if Data^.Centered then
begin
X := ((CellRect.Left + CellRect.Right) div 2) - (Data^.Image.Width div 2);
Y := ((CellRect.Top + CellRect.Bottom) div 2) - (Data^.Image.Height div 2);
end
else
begin
X := CellRect.Left; // + Margin ...
Y := CellRect.Top; // + Margin ...
end;
TargetCanvas.Draw(X, Y, Data^.Image);
end;