Firemonkey TControl subclass cannot draw on component

泪湿孤枕 提交于 2019-11-28 08:55:37

问题


I want to try to create a firemonkey visual component and I have seen online that TControl gives the basic needs. This is what I have done so far:

  TMyTest = class(TControl)
  strict private
    //code...
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    //code...
  end;

I have looked at the source code of a FMX component called PlotGrid and I have copied what it does. My class descends from TControl (like PlotGrid) and it overrides Paint (like PlotGrid). Look at the code:

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;

Given this code, I expect to have something like this (I have edited with paint the image, it's not the real one)

The problem is that I get this

The component is fine because I see all the methods and properties and they work. The component is functional BUT I cannot see it in the designer! If I run the FMX application I cannot see the colors:

Any idea?


I have set the Opacity := 1; at the beginning of the Paint event but still nothing.


回答1:


Your control is painting on shared canvas. By the time it reaches your control's Paint method value of Canvas.Stroke.Kind is TBrushKind.None so if you don't assign some other value to it, it will not actually paint anything.

You have to add

Canvas.Stroke.Kind := TBrushKind.Solid;

But, that will only paint horizontal line (you forgot to create points and make DrawLine call for vertical one) and it will not fill the background with white color.

The simplest way to do so is with

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

In general common canvas values can (and will) be changed by other controls. Better way to deal with those is to mimic code from TShape providing your own TFill and TStroke fields and assigning those to canvas before painting. That way you can be sure that you will not miss setting some particular Stroke or Fill value that can be changed outside your control.



来源:https://stackoverflow.com/questions/52017928/firemonkey-tcontrol-subclass-cannot-draw-on-component

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!