【问题标题】:MakeScreenshot for dynamically created controlMakeScreenshot 用于动态创建的控件
【发布时间】:2018-11-14 11:52:10
【问题描述】:

我需要动态地将创建的控件绘制到位图。

但它不起作用,它不绘制任何东西。

procedure TForm2.Button1Click(Sender: TObject);
var
  cb: TCheckBox;
  BMP: TBitmap;
begin
  BMP:= nil;

  cb:= TCheckBox.Create(nil);
  try
    cb.IsChecked:= true;
    cb.Repaint;
    BMP:= cb.MakeScreenshot;
    BMP.SaveToFile('C:\bmp.bmp');
  finally
    FreeAndNil(cb);
    FreeAndNil(BMP);
  end;
end;

我也直接尝试过PaintTo - 但效果相同。我也试过设置parent,但这还不够。

如果我对在表单上手动放置的控件执行相同操作,但不是动态创建的。

如何做到这一点。这个控件不应该在我只需要绘制它并释放它的任何地方可见。

【问题讨论】:

  • 我真的很感兴趣为什么有人投票反对这个问题?不清楚?这不显示我的努力吗?还是什么?
  • 您是否尝试在复选框中添加父级?
  • 我的建议是您的TCheckBox 在截屏之前应该是可见的。我怀疑控件是否将其视觉外观存储在内部位图上,并准备好按需交付。并将位图创建在单独的try...finally 中。
  • @Dima TCheckBox 在新建时默认可见。不需要在 BMP 周围添加额外的try/finally - 它被初始化为nil,因此现有的Free 将处理MakeScreenShot 中生成的对象,如果它成功创建但随后在try 中调用失败。

标签: delphi firemonkey delphi-10.2-tokyo


【解决方案1】:

两个问题。首先,您确实需要将控件设置为父级才能使其可绘制。

其次,您将保存为 BMP,它不支持 FMX 中用于生成屏幕截图的透明度(并且是特定于平台的)。将其另存为 PNG。

procedure TForm1.FormCreate(Sender: TObject);
var
  cb: TCheckBox;
  BMP: TBitmap;
begin
  BMP:= nil;
  cb:= TCheckBox.Create(nil);
  try
    cb.Parent := self;
    cb.Text := 'testing';      
    cb.IsChecked:= true;
    bmp := cb.MakeScreenshot;
    BMP.SaveToFile('C:\bmp.png');
  finally
    cb.Free;
    BMP.Free;
  end;
end;

【讨论】:

  • 有趣的细节,如果你省略Text 赋值,整个cb 图像是全黑的。如果您只指定一个空格或任何其他文本,它会按预期显示。
  • 是的,问题出在TEXT。如果省略,则根本不会绘制复选框。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2011-06-27
  • 2012-07-12
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多