TControl skaliert als Bitmap speichern

    TControl skaliert als Bitmap speichern

    Hallo,

    Ich Erzeuge in einem TPanel dynamisch (Anzahl: 4-5 Stellig) 2D-Formen wie Kreise, Linien, Rechtecke und Text-Objekte. Die Objekte können dann interaktiv am Bildschirm geändert werden. Auch nutze ich die Scale und Rotate Eigenschaft von TControl. Nun möchte ich das Panel so wie es am Bildschirm angezeigt wird (in seiner Rotation und Skalierung) in einer Bitmap/Grafik speichern und dann in einem Report (Fastreport) weiter verwenden.

    Mit TControl.MakeScreenshot kann ich den Canvas allerdings nur vor Rotation und Skalierung speichern. Hat jemand eine Idee?


    Gruß
    Stufable
    Bilder
    • Screenshot.png

      96,24 kB, 766×584, 26 mal angesehen
    Hmm..

    Ich hab ein Panel (Panel1) auf einer Form plaziert und dann noch weitere Controls draufgeschmissen.

    Delphi-Code

    1. procedure TForm1.Button2Click(Sender: TObject);
    2. var
    3. tmpBMP : TBitMap;
    4. begin
    5. tmpBMP := TBitMap.Create;
    6. try
    7. tmpBMP.Width := Panel1.Width;
    8. tmpBMP.Height := Panel1.Height;
    9. Panel1.PaintTo(tmpBMP.Canvas,0,0);
    10. Image1.Picture.Assign(tmpBMP);
    11. finally
    12. tmpBMP.Free;
    13. end;
    14. end;


    Mit PaintTo wird das Panel mit allen seinen Contols in ein Bitmap gemalt..
    Mit diesem kannst Du dann machen, was Du möchtest..

    (Hinweis : Delphi 6)
    Hallo Holger,Ja, es wird in ein Bitmap gemalt, aber vorher wird die Skalierung auf 1 zurückgesetzt. D.h. ich bekomme das Bitmap unskaliert.Jetzt dachte ich Winapi.Windows.BitBlt zu verwenden (wir im Link von haentschman), allerdings hat FXM.TControl.Canvas kein Window-Handle.

    Quellcode

    1. function TForm1.ControlToBitmap(Control: FMX.TControl):FMX.TBitmap;
    2. var
    3. SrcHnd: Cardinal;
    4. DestHnd: Cardinal;
    5. begin
    6. Result := TBitmap.Create;
    7. Result.Width := Trunc(Control.Width);
    8. Result.Height := Trunc(Control.Height);
    9. SrcHnd := TWinWindowHandle(Control).Wnd; // => Ich bekomme ein Handle
    10. DestHnd := TWinWindowHandle(Result.Canvas).Wnd; // => ich bekomme 0
    11. Winapi.Windows.BitBlt(
    12. DestHnd,
    13. 0, 0, Result.Width, Result.Height,
    14. SrcHnd, 0, 0, SRCCOPY);
    15. end;