Einzelnen Beitrag anzeigen

philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
867 Beiträge
 
Delphi 10.4 Sydney
 
#1

makeScreenshot, aber mit bitmapScale=1

  Alt 15. Jun 2022, 20:02
Hi,

ich möchte mein TPie-Objekt mit einem dynamisch erzeugten TBitmap befüllen. Wenn ich den WrapMode auf TileStretch setze, verzieht sich bei nicht vollständiger Anzeige (startAngle=-220, endAngle=40) leider die Anzeige. Es funktioniert mit TileOriginal, aber dann muss das TBitmap genau die Größe des TPie-Objektes haben. Wenn ich jetzt das TBitmap dynamisch erzeuge, mache ich dies per TRectangle mit mehreren TPieElementen und mache davon dann bitmap:=rectangle.makeScreenshot().

So lange jetzt meine Bildschirmauflösung mit 100% genutzt wird, alles schön. Ist dies aber ein anderer Faktor, hat das Bitmap eine falsche Größe. Nachträglich bitmap.bitmapScale:=1 zu setzen, hilft leider nicht.

Mein Workaround ist aktuell das Rectangle in vierfacher Größe zu erstellen und dann vom Bitmap ein createThumbnail mit der richtigen Größe zu erzeugen, was aber eine unnötige Kopie darstellt. Geht dies auch einfacher?

Delphi-Quellcode:
var rect:TRectangle;
    nextPie:TPie;
    nextStartAngle:single;
    newBitmap1,newBitmap2:TBitmap;
begin
   rect:=TRectangle.create(owner);
   rect.visible:=false;
   rect.parent:=owner;
   rect.width:=diameter;
   rect.height:=diameter;

   nextStartAngle:=-270;
   numberOfLevel:=7;
   for i:=0 to numberOfLevel-1 do
   begin
     nextPie:=TPie.create(owner);
     nextPie.beginUpdate();
     nextPie.parent:=rect;
     nextPie.width:=diameter;
     nextPie.height:=diameter;
     nextPie.startAngle:=nextStartAngle;
     if (i=0) then
       nextPie.endAngle:=nextStartAngle+40+270+startAngle
     else if (i=numberOfLevel-1) then
       nextPie.endAngle:=90
     else
       nextPie.endAngle:=nextStartAngle+(280/numberOfLevel);
     nextPie.Fill.Color:=TLeg.getLegLevelColorX(i);
     nextStartAngle:=nextPie.endAngle;
     nextPie.endUpdate();
   end;

   newBitmap1:=rect.MakeScreenshot();
   if (newBitmap1.bitmapScale=1) then
   begin
     bitmap.setSize(round(diameter),round(diameter));
     bitmap.copyFromBitmap(newBitmap1);
     newBitmap1.free();
   end else begin
     newBitmap2:=newBitmap1.createThumbnail(round(diameter),round(diameter));
     bitmap.setSize(round(diameter),round(diameter));
     bitmap.copyFromBitmap(newBitmap2);
     newBitmap1.free();
     newBitmap2.free();
   end;
end;
Grüße, Philipp

Geändert von philipp.hofmann (16. Jun 2022 um 07:57 Uhr)
  Mit Zitat antworten Zitat