为什么这些 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 = 1
和 ShpHorizontal.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 次左右。
它们的设计时属性几乎相同:
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 = 1
和 ShpHorizontal.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 次左右。