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