AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

makeScreenshot, aber mit bitmapScale=1

Ein Thema von philipp.hofmann · begonnen am 15. Jun 2022
Antwort Antwort
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
864 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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz