我想尝试创建一个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应用程序,则看不到颜色:
有什么主意吗?
我在Opacity := 1;
事件开始时设置了Paint
,但仍然没有设置。
答案 0 :(得分:7)
您的控件正在共享画布上绘画。在达到控件的Paint
的{{1}}方法值时,Canvas.Stroke.Kind
为TBrushKind.None
,因此,如果您不为其分配其他值,则它实际上不会绘制任何内容。
您必须添加
Canvas.Stroke.Kind := TBrushKind.Solid;
但是,这只会绘制水平线(您忘记创建点并DrawLine
调用垂直线),并且不会用白色填充背景。
最简单的方法是使用
Canvas.ClearRect(ClipRect, TAlphaColorRec.White);
通常,其他控件可以(并且将)更改常见的画布值。处理这些问题的更好方法是模仿TShape
中提供自己的TFill
和TStroke
字段的代码,并在绘画之前将其分配给画布。这样,您可以确保不会错过设置某些可以在控制范围之外更改的特定“笔划”或“填充”值。