【问题标题】:How to draw a dotted line in Firemonkey?如何在 Firemonkey 中画一条虚线?
【发布时间】:2016-05-08 13:49:51
【问题描述】:

我想在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 相同的虚线,以便像第一张示例图像一样绘制网格?

【问题讨论】:

  • 只是我在这里添加的一个注释,将粗细设置为 2 显示为虚线,但不够小/不够细。
  • 附加说明,没有意识到你可以使用像 0.5 这样的浮点值来表示粗细,但仍然无法使绘制的线条看起来正确。

标签: delphi firemonkey delphi-xe7


【解决方案1】:

无需深入了解“为什么起作用”,您可以通过将线宽的一半添加(或减去)坐标来实现 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

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

【讨论】:

  • 太棒了!诚然,我直到现在才真正使用 Firemonkey,但我可以在你的回答中看到一些魔力:)
  • 查看 TLine 的好地方,我也尝试过查看源代码,但事情对我来说并不总是很清楚。
猜你喜欢
  • 2021-10-11
  • 2013-07-20
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2012-05-19
相关资源
最近更新 更多