代码之家  ›  专栏  ›  技术社区  ›  Raffaele Rossi

Firemonkey TControl子类无法在组件上绘制

  •  3
  • Raffaele Rossi  · 技术社区  · 7 年前

    我想尝试创建一个firemonkey可视化组件,我在网上看到 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)。看看代码:

    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

    知道吗?


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

    1 回复  |  直到 7 年前
        1
  •  7
  •   Dalija Prasnikar    7 年前

    Paint 方法值 Canvas.Stroke.Kind TBrushKind.None 所以如果你不给它赋值,它实际上不会画任何东西。

    你得加上

    Canvas.Stroke.Kind := TBrushKind.Solid;
    

    但是,那只会画水平线(你忘了创建点和 DrawLine 调用垂直的),它不会用白色填充背景。

    最简单的方法是

    Canvas.ClearRect(ClipRect, TAlphaColorRec.White);
    

    TShape 提供你自己的 TFill TStroke 并在绘制之前将这些字段指定给画布。这样,您可以确保您不会错过设置某些特定的笔划或填充值,这些值可以在您的控制范围之外更改。