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

3

我想尝试创建一个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

任何想法?
我已经在Paint事件的开头设置了Opacity := 1;,但仍然没有任何效果。

你的控件的(Absolute)Opacity设置为多少? - Remy Lebeau
我该如何检查它?我没有在任何地方设置不透明度。我已经在构造函数中尝试了 Opacity := 1;,但仍然没有效果。 - Raffaele Rossi
你是否设置了 Parent 属性?通常在实例化控件时就会设置它。作为一个快速测试,在构造函数中添加 Parent := AOwner;。但不要像这样留下它。Owner 和 parent 不应该硬编码成相同的值。 - Tom Brunberg
1个回答

8
你的控件正在共享画布上绘制。当它到达你的控件的Paint方法时,Canvas.Stroke.Kind的值为TBrushKind.None,所以如果你不给它分配其他值,它实际上不会绘制任何东西。
你需要添加:
Canvas.Stroke.Kind := TBrushKind.Solid;

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

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

一般来说,常见的画布值可能会被其他控件更改。更好的方法是模仿 TShape 的代码,提供自己的 TFillTStroke 字段,并在绘制前将其分配给画布。这样,您可以确保不会错过设置一些特定的描边或填充值,而这些值可能会在您的控件之外更改。


Canvas.Stroke.Kind的默认值是TBrushKind.None... 我会称之为天才的创意。开个玩笑,顺便+1。 - MartynA
@MartynA 实际上,它最初是以Solid开始的,但很快就被更改为None了... 我重新表达了答案以使其更准确。 - Dalija Prasnikar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接