【问题标题】:Firemonkey TControl subclass cannot draw on componentFiremonkey TControl 子类不能在组件上绘制
【发布时间】:2019-01-31 17:30:41
【问题描述】:

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

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

问题是我明白了

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

有什么想法吗?


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

【问题讨论】:

  • 您的控件的(Absolute)Opacity 设置为什么?
  • 如何查看?我没有在任何地方设置不透明度。我试过不透明度:= 1;在构造函数中,但仍然没有
  • 您是否设置了Parent 属性?通常在实例化控件时设置。作为快速测试,在构造函数中添加Parent := AOwner;。不过,不要这样。不应将所有者和父级硬编码为相同。

标签: delphi firemonkey


【解决方案1】:

您的控件正在共享画布上绘画。当它到达控件的Canvas.Stroke.KindPaint 方法值时,它是TBrushKind.None,所以如果你不给它分配一些其他值,它实际上不会绘制任何东西。

你必须添加

Canvas.Stroke.Kind := TBrushKind.Solid;

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

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

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

【讨论】:

  • "Canvas.Stroke.Kind 的默认值是 TBrushKind.None ..." 我认为这是天才之举。不是。 +1,顺便说一句
  • @MartynA 实际上,它最初以 Solid 开头,但很快就更改为 None ......我重新表述了答案以更准确。
猜你喜欢
  • 2016-09-09
  • 1970-01-01
  • 2017-06-30
  • 2013-04-05
  • 2019-12-27
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多