为什么这些 TShape 看起来如此不同?

Why do these TShapes look so different?

它们的设计时属性几乎相同:

object ShpRectangle: TShape
  Left = 272
  Top = 96
  Width = 409
  Height = 473
  Brush.Style = bsClear
  Pen.Color = clWhite
  Pen.Mode = pmMaskPenNot
  Pen.Style = psDash
end
object ShpHorizontal: TShape
  Left = 221
  Top = 420
  Width = 500
  Height = 1
  Brush.Style = bsClear
  Pen.Color = clWhite
  Pen.Mode = pmMaskPenNot
  Pen.Style = psDash
end
object ShpVertical: TShape
  Left = 480
  Top = 50
  Width = 1
  Height = 540
  Brush.Style = bsClear
  Pen.Color = clWhite
  Pen.Mode = pmMaskPenNot
  Pen.Style = psDash
end

ShpVertical.Width = 1ShpHorizontal.Height = 1,这可能使它们与 ShpRectangle 不同,但它们都不同。
我可以让这些 TShape 看起来相似吗?

请注意,我给它们 pmMaskPenNot/pmDash 是因为它们用作覆盖 TImage 的指示线。
(在那种情况下它们仍然看起来像图片中的那样)。

这里我有一个表单,其中包含两个 TShape 矩形,边框为 dashed-dotted,一个高度为 9 px,另一个高度为 1 px,它们的宽度均已设置动画:

正如您想象的那样,“线”实际上由两条线组成——一条上边框和一条底边框——它的外观取决于它们的相位差,而相位差又取决于宽度。

你真的无能为力。

无论如何,结合VCL控件来创建图片都不是一个好主意。 (通过这样做创建动画更糟糕!)而是使用 GDI、GDI+ 或 Direct2D 手动绘制图片。所有这些 API 都有非常 easy-to-use 的方法来绘制线条。使用 GDI+ 和 Direct2D,您甚至可以绘制 non-solid 粗线。

这是一个 GDI 示例:

procedure TForm1.FormPaint(Sender: TObject);
begin

  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(ClientRect);
  Canvas.Pen.Color := clBlack;

  Canvas.Pen.Style := psDashDot;
  Canvas.MoveTo(10, ClientHeight div 2);
  Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2);

  Canvas.Pen.Style := psDash;
  Canvas.MoveTo(10, ClientHeight div 2 - 5);
  Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2 - 5);

  Canvas.Pen.Style := psDot;
  Canvas.MoveTo(10, ClientHeight div 2 + 5);
  Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2 + 5);

  x := x + 0.01;

end;

A TTimer 每秒使表单无效 30 次左右。