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

时间:2018-08-25 13:48:18

标签: delphi firemonkey

我想尝试创建一个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组件的源代码,并复制了它的功能。我的课程来自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;

鉴于此代码,我希望有这样的内容(我已经对图像进行了编辑,但这不是真正的图像)

enter image description here

问题是我明白了

enter image description here

该组件很好,因为我看到了所有方法和属性,并且它们都起作用。该组件正常运行,但我无法在设计器中看到它!如果我运行FMX应用程序,则看不到颜色:

enter image description here

有什么主意吗?


我在Opacity := 1;事件开始时设置了Paint,但仍然没有设置。

1 个答案:

答案 0 :(得分:7)

您的控件正在共享画布上绘画。在达到控件的Paint的{​​{1}}方法值时,Canvas.Stroke.KindTBrushKind.None,因此,如果您不为其分配其他值,则它实际上不会绘制任何内容。

您必须添加

Canvas.Stroke.Kind := TBrushKind.Solid;

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

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

通常,其他控件可以(并且将)更改常见的画布值。处理这些问题的更好方法是模仿TShape中提供自己的TFillTStroke字段的代码,并在绘画之前将其分配给画布。这样,您可以确保不会错过设置某些可以在控制范围之外更改的特定“笔划”或“填充”值。