Nach langem Suchen haben ich folgenden Quelltext gefunden, der genau das macht was ich will.
Code:
procedure DrawPngWithAlpha(Src, Dest: TPngImage; const R: TRect);
var
X, Y: Integer;
Alpha: PByte;
begin
Src.Draw(Dest.Canvas, R);
for Y := R.Top to R.Bottom - 1 do
for X := R.Left to R.Right - 1 do
begin
Alpha := @Dest.AlphaScanline[Y]^[X];
Alpha^ := Min(255, Alpha^ + Src.AlphaScanline[Y - R.Top]^[X - R.Left]);
end;
end;
Allerdings ist der Quelltext sehr unperformant, da ich ja sehr häufig die Form neu zeichnen lasse, da ich die gesamte Form mittels UpdateLayeredWindow zeichne.
Gibt es da alternativen, oder ist meine Herangehensweise eventuell falsch?
Ich habe ein TImage-Object auf welches dann aus Bildresourcen die Form zusammengesetzt wird. Das realisiere ich erstmalig mit Assign, um den Hintergrund zuzuweisen und alles weitere kommt dann mit Draw, oder oben genannter Funktion auf das TImage.
Dann benutze ich TJvTransparentForm mit dem TImage als Layer, um meine Form mit dem gewünschten Design auszustatten. Jedoch will ich, dass sich die Form alle paar Millisekunden neu Zeichnet, da sich das TImage ja auch verändern kann (Laufschrift, etc.).
Macht man das so, oder benutzt man da lieber ein OnPaint-Ereignis? Momentan liegt die CPU-Auslastung bei ca 10-15%, was meiner Meinung nach zu viel ist.