我想尝试创建一个firemonkey可视化组件,我在网上看到 TControl 提供基本需求。这就是我目前所做的:
TControl
TMyTest = class(TControl) strict private //code... protected procedure Paint; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; //code... end;
PlotGrid 我已经复制了它的功能。我的类从TControl(如PlotGrid)派生,并重写Paint(如PlotGrid)。看看代码:
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应用程序,我看不到颜色:
知道吗?
我已经设置了 Opacity := 1; 在 Paint 事件,但仍然没有。
Opacity := 1;
Paint
Paint 方法值 Canvas.Stroke.Kind 是 TBrushKind.None 所以如果你不给它赋值,它实际上不会画任何东西。
Canvas.Stroke.Kind
TBrushKind.None
你得加上
Canvas.Stroke.Kind := TBrushKind.Solid;
但是,那只会画水平线(你忘了创建点和 DrawLine 调用垂直的),它不会用白色填充背景。
DrawLine
最简单的方法是
Canvas.ClearRect(ClipRect, TAlphaColorRec.White);
TShape 提供你自己的 TFill 和 TStroke 并在绘制之前将这些字段指定给画布。这样,您可以确保您不会错过设置某些特定的笔划或填充值,这些值可以在您的控制范围之外更改。
TShape
TFill
TStroke