delphi - 为动态创建的控件制作屏幕截图

标签 delphi firemonkey delphi-10.2-tokyo

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

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

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 但这仍然不够。

如果我对手动放置在表单上的控件执行相同的操作,则它正在工作,但动态创建的控件却不起作用。

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

最佳答案

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

其次,您保存为 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;

关于delphi - 为动态创建的控件制作屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53299629/

相关文章:

ios - Delphi XE2 文件共享和 iOS

delphi - 使用 OpenSSL 生成 key 对

delphi - 关于德尔福之翼 (ORM)

delphi - Objective Pascal - 如何确保在转换为祖先时调用后代的方法?

delphi - 如何在不使用存储过程的情况下使用 dbExpress 框架更改生成器值?

database - Delphi XE2中的FireMonkey框架直接支持Mac的哪些数据库?

inno-setup - Inno Setup - FileCopy 在路径名中使用通配符

ios - 德尔福 + iOS : How to declare simple ObjC-Class?

delphi - 当我执行 OnDblClick 事件 (Form1) 打开 Form2 时,它会触发 Form2 的 OnCellClick 事件,而无需单击 form2 网格

ios - 如何通过IPv6正确打开网址?