Firemonkey 控件不绘制

Posted

技术标签:

【中文标题】Firemonkey 控件不绘制【英文标题】:Firemonkey controls do not draw 【发布时间】: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;

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

【问题讨论】:

【参考方案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 代码的其他地方完成了。

以上是关于Firemonkey 控件不绘制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firemonkey 的 TTabItem 中插入另一个控件

firemonkey 手机屏幕自适应程序问题

实现 TComponentEditor 的自定义 Firemonkey 组件。在设计时将子控件添加到父控件

Firemonkey:如何定义一个包含另一个组件的组件?

[修正] Firemonkey TSelection 控件等比缩放时,左下角拉动问题

VirtualTreeView 的 Firemonkey 版本