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

Raf*_*ssi 3 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;
Run Code Online (Sandbox Code Playgroud)

我查看了FMX组件的源代码,PlotGrid我已经复制了它的功能.我的班级来自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;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

问题是我得到了这个

在此输入图像描述

组件很好,因为我看到所有的方法和属性,他们工作.该组件是功能但我在设计师看不到它!如果我运行FMX应用程序,我看不到颜色:

在此输入图像描述

任何的想法?


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

Dal*_*kar 7

您的控件是在共享画布上绘制.通过它达到你控制的时间Paint方法的价值Canvas.Stroke.KindTBrushKind.None如此,如果你不分配一些其他的价值,它实际上不会画什么.

你必须添加

Canvas.Stroke.Kind := TBrushKind.Solid;
Run Code Online (Sandbox Code Playgroud)

但是,这只会画水平线(你忘了创建点并DrawLine调用垂直线),它不会用白色填充背景.

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);
Run Code Online (Sandbox Code Playgroud)

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