【问题标题】:Firemonkey controls do not drawFiremonkey 控件不绘制
【发布时间】:2016-09-09 08:37:55
【问题描述】:

在尝试绘制控件时,我根本不知道自己做错了什么。

我尝试过使用 TCanvas.BeginScene()/TCanvas.EndScene(),尝试使用其他方法(例如主窗体 OnPaint())进行绘画。
我试过 TControl.InvalidateRect()。
我什么也得不到。

这是我的测试应用程序中的内容:

type
  TTestControl = class(TControl)
  protected
    procedure Paint; override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fTestControl: TTestControl;
  end;

procedure TTestControl.Paint;
begin
  Canvas.Fill.Color := TColorRec.Blueviolet;
  Canvas.FillEllipse(ClipRect, AbsoluteOpacity);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fTestControl := TTestControl.Create(Self);
  fTestControl.Parent := Self;
  fTestControl.Align  := TAlignLayout.Client;
end;

根据网上的说法,应该够了。
有什么建议吗?

【问题讨论】:

    标签: delphi components firemonkey


    【解决方案1】:

    Canvas.Fill.ColorTAlphaColor

    换行

      Canvas.Fill.Color := TColorRec.Blueviolet;
    

      Canvas.Fill.Color := TAlphaColors.Blueviolet;
    

    【讨论】:

      【解决方案2】:

      你的 Paint 方法应该是这样的:

      procedure TTestControl.Paint;
      begin
        inherited;
        Canvas.BeginScene;
        Canvas.Fill.Color := claBlueviolet;
        Canvas.FillEllipse(ClipRect, AbsoluteOpacity);
        Canvas.EndScene;
      end;
      

      我也认为你应该重写 TControl 的 DoPaint 方法而不是 Paint。

      【讨论】:

      • 实际上它应该有一个 try / finally 块。但这并不能解决这个问题。
      • 我相信它们在 TControl.Paint 中是多余的,因为它们已经在 FMX 代码的其他地方完成了。
      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2013-04-05
      • 2012-01-14
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多