VCLコントロールに問題があるようだというjachguateのコメントに同意します。の可能性のある設計上の問題TCustomListView.CNNotify
。しかし、そこでの論理に従うのは簡単ではありません。
1つの解決策は、DefaultDrawがtrueの場合にコントロールのキャンバスを強制的に変更することです。これにより、VCLは、カスタム描画通知が返される前に、渡されたDCに対してコントロールのフォントを再度作成して選択します。例:
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;
私が好む方法は、可能な限り、コントロールのキャンバスの使用を避けることです。ケースに一時的なDCを使用できます。これにより、質問へのコメントで言及されている黒い背景の問題も回避されます。
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;