我有一个 TPanel 组件在我的form.This面板上,它有很多子组件,比如TLabel、TImage、TLine,TPanel etc.This面板是用来在计时器上更新的。我想在任何时候捕捉这个面板的截图。当我只使用TPanel.MakeScreenshot时,它只显示像TImage和TLine这样的孩子。TLabels失踪了。
有没有人知道如何做到这一点。
我正在使用德尔福XE5和火猴。
谢谢。
发布于 2014-06-30 15:17:14
在制作一个组件以捕获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才能使它们出现。
如果将AutoSize的TLabel设置为true并设置文本,则情况相同。标签的宽度在实际显示在窗体上之前不会调整。
我还没有在FMX源代码中详细查看过这一点,但可能是某个地方的bug,因为它只影响一些组件。
您还没有显示代码,所以我不确定这是否是同一个问题,但听起来确实是这样。
顺便说一句,您可能知道不能直接从另一个线程更新FMX控件,因为它们不是线程安全的,对吗?你还释放了从TBitmap回来的MakeScreenshot?
https://stackoverflow.com/questions/24319996
复制相似问题