gpt4 book ai didi

delphi - Firemonkey TControl 子类无法在组件上绘图

转载 作者:行者123 更新时间:2023-12-03 15:46:06 24 4
gpt4 key购买 nike

我想尝试创建一个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;,但仍然没有任何结果。

最佳答案

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

您必须添加

Canvas.Stroke.Kind := TBrushKind.Solid;

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

最简单的方法是使用

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

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

关于delphi - Firemonkey TControl 子类无法在组件上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52017928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com