我的一个表单上有一个TPanel组件。这个面板有很多子组件,如 TLabel、TImage、TLine、TPanel 等。这个面板用于在计时器上更新。我想随时截取此面板的屏幕截图。当我只使用 TPanel.MakeScreenshot 时,它只显示像 TImage 和 TLine 这样的孩子。缺少 TLabel。
有没有人知道如何实现它。
我正在使用 Delphi XE5 和firemonkey。
谢谢。
我的一个表单上有一个TPanel组件。这个面板有很多子组件,如 TLabel、TImage、TLine、TPanel 等。这个面板用于在计时器上更新。我想随时截取此面板的屏幕截图。当我只使用 TPanel.MakeScreenshot 时,它只显示像 TImage 和 TLine 这样的孩子。缺少 TLabel。
有没有人知道如何实现它。
我正在使用 Delphi XE5 和firemonkey。
谢谢。
在制作组件以捕获 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?