首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ListView会忽略自定义绘图中的字体和画笔设置?

为什么ListView会忽略自定义绘图中的字体和画笔设置?
EN

Stack Overflow用户
提问于 2016-09-20 11:34:36
回答 1查看 478关注 0票数 3

我试图用自定义字体样式和背景色在列表视图中绘制项目。表单上有默认的列表视图。我把ViewStyle改成了vsReport,把OwnerDraw改成了True。增加了3列和3项。并分配OnCustomDrawItem事件:

代码语言:javascript
复制
procedure TForm1.lv1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var
  lvCanvas: TCanvas;
  R: TRect;
  S: string;
begin
  DefaultDraw := False;

  lvCanvas := Sender.Canvas;

  // column 1
  R := Item.DisplayRect(drBounds);
  R.Right := Sender.Column[0].Width;

  lvCanvas.Brush.Color := clRed;
  lvCanvas.Font.Style := [fsBold];
  S := 'Bold with red background';

  lvCanvas.FillRect(R);
  lvCanvas.TextRect(R, S, [tfSingleLine, tfEndEllipsis, tfCenter, tfVerticalCenter]);

  // column 2
  R.Left := R.Right;
  R.Right := R.Left + Sender.Column[1].Width;

  lvCanvas.Brush.Color := clGreen;
  lvCanvas.Font.Style := [fsItalic];
  S := 'Italic with green background';

  lvCanvas.FillRect(R);
  lvCanvas.TextRect(R, S, [tfSingleLine, tfEndEllipsis, tfCenter, tfVerticalCenter]);

  // column 3
  R.Left := R.Right;
  R.Right := R.Left + Sender.Column[2].Width;

  lvCanvas.Brush.Color := clBlue;
  lvCanvas.Font.Style := [fsUnderline];
  S := 'Underline with blue background';

  lvCanvas.FillRect(R);
  lvCanvas.TextRect(R, S, [tfSingleLine, tfEndEllipsis, tfCenter, tfVerticalCenter]);
end;

但结果并不像预期的那样:

第二栏中的文字应该是斜体,而不是粗体和绿色背景。第三栏中的文本应该是下划线,而不是粗体和蓝色背景。

  • 使用TextOut代替TextRect绘制文本会产生相同的结果。
  • 我尝试在delphi-xe5中运行这个测试项目,但是结果是一样的。
  • 所有列中文本背景的颜色始终与第一列相同。

有人能向我解释一下发生了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 13:41:12

我试过同样的方法,但实际上,它不起作用。画布不做你想做的事。所以我用尝试了一个自己的控制画布,希望它能做得更好,事实上,它也会做得更好。(我可能稍后会发一张照片)。

尝试以下代码:

代码语言:javascript
复制
var
  lvCanvas: TCanvas;
  R: TRect;
  S: string;
begin
  DefaultDraw := False;

  lvCanvas := TControlCanvas.Create;

  { Try-finally-end is needed, because this Canvas is under our control. }
  try
    TControlCanvas(lvCanvas).Control := lv1;

    { ... Start of original drawing code ... }
    // column 1
    R := Item.DisplayRect(drBounds);

    { ... Drawing code is same as in question; snipped for brevity. ... }

    lvCanvas.TextRect(R, S, [tfSingleLine, tfEndEllipsis, tfCenter, tfVerticalCenter]);
    { ... End of original drawing code ... }

  finally
    lvCanvas.Free;
  end;
end;

这做你想做的事。只有第一列显示粗体文本,第二列显示斜体文本等,第二列和第三列不再有红色背景。

更新

如复制所示,每次更改字体设置时,使用原始Sender.Canvas并执行lvCanvas.Refresh;操作也同样有效。这显然不是TControlCanvas所必需的。因此,您可以使用TControlCanvas作为替代,尽管这会绑定更多的资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39592987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档