我同意 jachguate 的评论,即 VCL 控件似乎存在问题;一个可能的设计问题TCustomListView.CNNotify
。但要遵循那里的逻辑并不容易。
一种解决方案是在 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;