Das FillRect stört die
VCL gar nicht, es werden Veränderungen am Brush und am Font protokolliert.
Probier mal die markierte Zeile einzufügen (ungetestet, wär allerdings ein ziemlich dreckiger Trick...)
Delphi-Quellcode:
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
NodeRect: TRect;
begin
NodeRect := Node.DisplayRect(False);
Sender.Canvas.Brush.OnChange := nil; //<--- HIER
if cdsSelected in State then
Sender.Canvas.Brush.Color := clLime
else
Sender.Canvas.Brush.Color := TTreeView(Sender).Color;
Sender.Canvas.FillRect(NodeRect);
DefaultDraw := True;
end;
Alternativ zeichne den Hintergrund mit dem Windows-
API (ebenfalls ungetestet):
Delphi-Quellcode:
var
hbr: THandle;
begin
...
if cdsSelected in State then
hbr := Windows.CreateSolidBrush(ColorToRGB(clLime));
else
hbr := Windows.CreateSolidBrush(ColorToRGB(TTreeView(Sender).Color));
if hbr = 0 then
RaiseLastWin32Error;
try
Windows.FillRect(Canvas.Handle, NodeRect, hbr);
finally
Windows.DeleteObject(hbr);
end;
...
end;