我有一个 TListView,我想在其中显示一个带有粗体文本的特定行。为此,我创建了一个 OnCustomDrawItem 处理程序,如下所示:
procedure TDataDirHandlingDlg.lvDataFoldersCustomDrawItem(
Sender: TCustomListView;
Item: TListItem;
State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
case GetItemStatus(Item.Data) of
ddNonExistent:
begin
Sender.Canvas.Font.Color := clGrayText;
Sender.Canvas.Font.Style := [];
end;
ddCurrent:
begin
Sender.Canvas.Font.Style := [fsBold];
Sender.Canvas.Font.Color := clBlue;
end;
else
begin
Sender.Canvas.Font.Color := clWindowText;
Sender.Canvas.Font.Style := [];
end;
end;
end;
(背景信息:它是某些目录及其属性的列表。恰好一个目录可以是“当前”,这就是我要强调的那个。GetStatusItem 返回一个枚举值,它可以是 ddOK、ddNonExistent 或 ddCurrent)。
这在使用 Delphi 10.2 ("Tokyo") Update 2 时按我预期的那样工作,但在使用 Update 3 时不起作用。更具体地说,字体颜色仍然有效。但字体样式没有。
我可以在 VCL 源代码中看到 Vcl.ComCtrls.pas 在 TCustomListView.CNNotify 中从 Update 2 更改为 Update 3,并且在 Update 3 中删除了 SaveDC/RestoreDC 调用。我猜它是相关的,但我没有但设法理解了代码。
如您所见,我没有尝试在处理程序中实际绘制文本。我只是更改画布的属性。
问题是:代码在更新 2 中工作是幸运的吗?我必须自己绘制文本,还是修改画布并让VCL继续绘制文本就足够了?如果是这样,为什么它在更新 3 中不起作用?