gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:57:43 24 4
gpt4 key购买 nike

我正在尝试使用自定义字体样式和背景颜色在 ListView 中绘制项目。表单上有一个默认的 ListView 。我变了ViewStylevsReportOwnerDrawTrue 。添加了 3 列和 3 个项目。并分配 OnCustomDrawItem事件:

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;
<小时/>

但结果并不如预期:

enter image description here

第二列中的文本应为斜体,但不为粗体,并且背景为绿色。第三列中的文本应带有下划线,但不为粗体,并且背景为蓝色。

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

谁能向我解释一下发生了什么?

最佳答案

我也尝试过,确实不行。 Canvas 不做你想做的事。所以我尝试使用自己的控制 Canvas ,希望它能做得更好,事实上,它确实做到了。 (我稍后可能会发布照片)。

尝试以下代码:

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 作为替代方案,尽管这会绑定(bind)更多资源。

关于listview - 为什么ListView会忽略自定义绘图中的字体和画笔设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39592987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com