Firemonkey TControl 子类无法在组件上绘制

Firemonkey TControl subclass cannot draw on component

我想尝试创建一个firemonkey可视化组件,我在网上看到TControl提供了基本需求。这是我到目前为止所做的:

  TMyTest = class(TControl)
  strict private
    //code...
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    //code...
  end;

我查看了名为 PlotGrid 的 FMX 组件的源代码,并复制了它的功能。我的 class 继承自 TControl(如 PlotGrid),它覆盖了 Paint(如 PlotGrid)。看代码:

constructor TMyTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SetAcceptsControls(False);
end;

destructor TMyTest.Destroy;
begin
  inherited;
end;

procedure TMyTest.Paint;
var
  i: integer;
  a, b: TPointF;
begin
  Canvas.Fill.Color := TAlphaColorRec.White;
  Canvas.Stroke.Color := TAlphaColorRec.Black;
  Canvas.Stroke.Thickness := 2;

  a.X := 0; a.Y := Height/2;
  b.X := Width;  b.Y := Height/2;
  Canvas.DrawLine(a, b, 1);
end;

鉴于此代码,我希望有这样的东西(我已经用绘制图像进行了编辑,它不是真实的)

问题是我明白了

该组件很好,因为我看到了所有的方法和属性,它们都有效。该组件是功能性的,但我在设计器中看不到它!如果我 运行 FMX 应用程序我看不到颜色:

有什么想法吗?


我已经在 Paint 事件的开头设置了 Opacity := 1; 但仍然没有。

您的控件正在共享 canvas 上绘制。当它到达您的控件的 Paint 方法值时 Canvas.Stroke.KindTBrushKind.None 因此如果您不为其分配其他值,它实际上不会绘制任何东西。

你必须添加

Canvas.Stroke.Kind := TBrushKind.Solid;

但是,这只会绘制水平线(您忘记创建点并 DrawLine 调用垂直线)并且不会用白色填充背景。

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

一般而言,canvas 值可以(并且将会)被其他控件更改。处理这些问题的更好方法是模仿 TShape 中的代码,提供您自己的 TFillTStroke 字段,并在绘制之前将它们分配给 canvas。这样您就可以确定您不会错过设置一些可以在您的控制之外更改的特定描边或填充值。