如何在 Firemonkey 中绘制虚线?

How to draw a dotted line in Firemonkey?

我想在 Firemonkey 项目的 TPaintbox canvas 上画一个点状网格,结果应该是这样的:

一开始我想我会画垂直虚线然后画水平虚线,所以考虑到这一点我试着先画一条线试图让外观恰到好处,这就是我尝试过:

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 形状可以按照我想要的方式做虚线:

但我需要自己在 canvas 上绘制,而不是使用额外的控件。为了记录 TLine 只需要将 Stroke.Dash 属性 更改为点。

那么,在 Firemonkey 项目中使用 canvas 如何绘制与 TLine 相同的虚线,以便我可以像第一个示例图像一样绘制网格?

无需进入 'why it works',您可以通过将线宽的一半添加(或减去)到坐标来实现 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