I agree with jachguate's comment with that there seems to be an issue with the VCL control; a possibe design issue with TCustomListView.CNNotify
. But it's not easy to follow the logic there.
One solution is to force a change on the canvas of the control when DefaultDraw is true, so that the VCL creates and selects the control's font again to the passed DC before the custom drawing notification returns. Example:
procedure TForm1.LVCustomDrawSubItem(Sender: TCustomListView; Item: TListItem;
SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
Var R: TRect;
bmp: TBitmap;
x: Integer;
begin
DefaultDraw := True;
if SubItem = 1 then begin
DefaultDraw := False;
...
...
Sender.Canvas.Draw(R.Left - 2, R.Top, Bmp);
Bmp.Free;
end;
end;
if DefaultDraw then
Sender.Canvas.Brush.Color := ColorToRGB(clWindow); // <--
end;
The way I would prefer is to avoid using the control's canvas, if at all possible. You can use a temporary DC for your case, this also avoids the black background problem mentioned in the comments to the question.
uses
commctrl;
...
procedure TForm1.LVCustomDrawSubItem(Sender: TCustomListView; Item: TListItem;
SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
Var R: TRect;
bmp: TBitmap;
x: Integer;
DC: HDC;
begin
DefaultDraw := True;
if SubItem = 1 then begin
DefaultDraw := False;
...
...
DC := GetDC(Sender.Handle);
ImageList_Draw(TypeImages.Handle, 0, DC, R.Left - 2, R.Top, ILD_NORMAL);
ReleaseDC(Sender.Handle, DC);
Bmp.Free;
end;
end;
end;