首页 > 解决方案 > 为什么这些 TShape 看起来如此不同?

问题描述

在此处输入图像描述

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

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,但它们三者都不同。
我可以让这些 TShapes 看起来相似吗?

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

标签: delphigraphics

解决方案


在这里,我有一个表单,其中包含两个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;

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

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


推荐阅读