动态创建控件的 MakeScreenshot

MakeScreenshot for dynamically created control

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

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

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;