delphi - TListView OnCustomDrawItem 行为在 10.2 更新 3 中更改
问题描述
我有一个 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 中不起作用?
解决方案
推荐阅读
- java - 活动不会在主页按钮后从广播接收器开始,而是在返回按钮后开始
- javascript - 如何动态地拥有根据按钮 ID 呈现不同信息的按钮
- c# - C# Linq merge a list of dictionaries
- python-3.x - How do I escape the '@' symbol inside a string literal key for a jmespath search query
- python - 从特定列中检索最大值时合并具有相同 id 的行
- python - 使用 keras 中的额外输入加载自定义损失
- mysql - 删除 innodb 表以释放磁盘空间是否安全
- reactjs - Redux Store 中的俄语编码问题
- powershell - 一个连接字符串中的多个 DB2 数据库,通过 ODBC 将测试表与 prod 进行比较
- javascript - 如何从 rails 控制器调用 Stripe Checkout