我有一个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(“东京”)更新2 但使用Update 3 无效。更具体地说,字体颜色仍然有效。但字体样式没有。
我可以在VCL源代码中看到Vcl.ComCtrls.pas已从TCustomListView.CNNotify中的Update 2更改为Update 3,并且在Update 3中删除了SaveDC / RestoreDC调用。我想它是相关的但是我还没有设法理解代码。
正如您所看到的,我没有尝试在处理程序中实际绘制文本。我只是改变了画布的属性。
问题是:在Update 2中运行代码真的很幸运吗?我是否必须自己绘制文本,或者是否足以修改画布并让VCL继续绘图文本?如果是这样,为什么它不能在Update 3中运行?