我想在Firemonkey项目的TPaintbox画布上绘制一个虚线网格,结果应该是这样的:
首先,我想我会绘制垂直虚线然后是水平虚线,所以考虑到这一点,我试图先绘制一条线以试图使外观恰到好处,这就是我尝试过的:
Canvas.Stroke.Color := TAlphaColorRec.Black;
Canvas.Stroke.Dash := TStrokeDash.Dot;
Canvas.Stroke.Kind := TBrushKind.Solid;
Canvas.Stroke.Thickness := 1;
Canvas.DrawLine(PointF(0, 0), PointF(0, 150), 1);
结果不是我所希望的,事实上TLine
形状可以做我想要的虚线:
但我需要在画布上绘制自己,而不是使用其他控件。对于记录TLine
,只需要将Stroke.Dash属性更改为Dot。
那么,使用Firemonkey项目中的画布,我如何绘制与TLine
相同的虚线,以便我可以像第一个样本图像一样绘制网格?
答案 0 :(得分:5)
如果没有进入'为什么它有效',你可以通过向坐标添加(或减去)一半线宽来实现1像素虚线(如在TLine
中)。在追踪TLine
所做的事情时,我明白了这个想法;在渲染过程中使用
InflateRect(Result, -(FStroke.Thickness / 2), -(FStroke.Thickness / 2));
将0.5修改应用于线坐标,得到相同的结果。
procedure TForm24.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
a: integer;
begin
Canvas.BeginScene;
try
Canvas.Stroke.Dash := TStrokeDash.Dot;
for a := 0 to 10 do
Canvas.DrawLine(PointF(a * 20 + 0.5, 0.5), PointF(a * 20 + 0.5, 200.5), 1);
for a := 0 to 10 do
Canvas.DrawLine(PointF(0.5, a * 20 + 0.5), PointF(200.5, a * 20 + 0.5), 1);
Canvas.DrawLine(PointF(0.5, 0.5), PointF(200.5, 200.5), 1);
Canvas.DrawEllipse(RectF(5.0, 5.0, 195.5, 195.5), 1);
finally
Canvas.EndScene;
end;
end;
产生这个结果:
放大镜视图为500%
编辑2018.02.23 :
另一种值得测试的方法是将表单 Quality
属性更改为HighPerformance