如何在Firemonkey中画一条虚线?

时间:2016-01-30 22:33:58

标签: delphi firemonkey delphi-xe7

我想在Firemonkey项目的TPaintbox画布上绘制一个虚线网格,结果应该是这样的:

enter image description here

首先,我想我会绘制垂直虚线然后是水平虚线,所以考虑到这一点,我试图先绘制一条线以试图使外观恰到好处,这就是我尝试过的:

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

enter image description here

但我需要在画布上绘制自己,而不是使用其他控件。对于记录TLine,只需要将Stroke.Dash属性更改为Dot。

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

1 个答案:

答案 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;

产生这个结果:

enter image description here enter image description here

放大镜视图为500%

编辑2018.02.23

另一种值得测试的方法是将表单 Quality属性更改为HighPerformance