我试图用自定义字体样式和背景色在列表视图中绘制项目。表单上有默认的列表视图。我把ViewStyle改成了vsReport,把OwnerDraw改成了True。增加了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;但结果并不像预期的那样:

第二栏中的文字应该是斜体,而不是粗体和绿色背景。第三栏中的文本应该是下划线,而不是粗体和蓝色背景。
TextOut代替TextRect绘制文本会产生相同的结果。有人能向我解释一下发生了什么吗?
发布于 2016-09-20 13:41:12
我试过同样的方法,但实际上,它不起作用。画布不做你想做的事。所以我用尝试了一个自己的控制画布,希望它能做得更好,事实上,它也会做得更好。(我可能稍后会发一张照片)。
尝试以下代码:
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作为替代,尽管这会绑定更多的资源。
https://stackoverflow.com/questions/39592987
复制相似问题