MakeScreenshot用于动态创建控件

时间:2018-11-14 11:52:11

标签: 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,但这仍然不够。 如果我对手动放置在表单上的控件执行相同的操作,则它正在工作,但无法动态创建。

如何执行此操作。我只需要绘画并释放它的任何地方都不应该看到此控件。

1 个答案:

答案 0 :(得分:4)

两个问题。首先,您确实需要将控件作为父项以便可绘制。

第二,您将另存为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;