首页 > 解决方案 > 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 中不起作用?

标签: delphidelphi-10.2-tokyotlistview

解决方案


推荐阅读