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

Jan*_*gen 1 delphi graphics

在此处输入图片说明

它们的设计时间属性实际上是相等的:

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
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*and 5

在这里,我有一个表单,其中包含两个TShape带有虚线边框的矩形,一个高度为 9 px,另一个高度为 1 px,它们的宽度都具有动画效果:

宽度增加的两种形状的屏幕录制。

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

你真的无能为力。

在任何情况下,通过组合 VCL 控件来创建图片都不是一个好主意。(这样做创建动画更糟糕!)相反,请使用 GDI、GDI+ 或 Direct2D 手动绘制图片。所有这些 API 都有非常易于使用的绘制线条的方法。使用 GDI+ 和 Direct2D,您甚至可以绘制非实心粗线。

这是一个 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;
Run Code Online (Sandbox Code Playgroud)

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

使用 GDI 手动绘制线条的屏幕录制