0

我的一个表单上有一个TPanel组件。这个面板有很多子组件,如 TLabel、TImage、TLine、TPanel 等。这个面板用于在计时器上更新。我想随时截取此面板的屏幕截图。当我只使用 TPanel.MakeScreenshot 时,它只显示像 TImage 和 TLine 这样的孩子。缺少 TLabel。

有没有人知道如何实现它。

我正在使用 Delphi XE5 和firemonkey

谢谢。

4

1 回答 1

0

在制作组件以捕获 TLayout 的内容时,我曾经遇到过类似的问题。在测试中,使用 TLayout.MakeScreenshot 截取的屏幕截图中没有显示某些组件。

这是因为当您在代码中创建 TLabel 时,当您将其作为 TPanel 的父级时,它不会自动绘制。它仅在第一次实际显示时才绘制。因此,如果你这样做,标签将不会显示:

var
  NewLabel: TLabel;
  Shot: TBitmap;
...
  NewLabel := TLabel.Create;
  NewLabel.Parent := Panel1; // I suppose you are setting the parent like this in your code
  NewLabel.Text := 'some new label';
  Shot := Panel1.MakeScreenshot;

要使标签显示,您必须让它们在 TPanel 画布上绘制。我用 ApplyStyleLookup 方法做到了,比如:

  ...
  NewLabel.Text := 'some new label';
  NewLabel.ApplyStyleLookup;
  Shot := Panel1.MakeScreenshot; // Now the label will show

您必须为每个标签调用 ApplyStyleLookup 才能使它们出现。

如果将 TLabel 的 AutoSize 设置为 true 并设置文本,则相同。标签的宽度在实际显示在表单上之前不会调整。
我没有在 FMX 源代码中详细查看这个,但可能是某个地方的错误,因为它只影响某些组件。

你还没有显示你的代码,所以我不确定这是否是同一个问题,但听起来确实如此。

顺便说一句,您可能知道您不能直接从另一个线程更新 FMX 控件,因为它们不是线程安全的,对吧?而且您还释放了从 MakeScreenshot 返回的 TBitmap?

于 2014-06-30T15:17:14.160 回答