Wobei eine Bitmap dafür eigentlich wenig sinnvoll ist. [...]
[...] Dann sind solche problematischen Workarounds gar nicht mehr nötig.
Ich glaube mit Bordmitteln geht das nicht wirklich, weil das alles noch auf GDI32 aufbaut. [...]
Ist schon interessant, wie hartnäckig sich Vorurteile halten...
Natürlich geht das auch mit
TBitmap.
Wichtig ist, daß bei der Erstellung des Bitmaps auch die Eigenschaft
AlphaFormat gesetzt wird, damit
TBitmap intern die Methode
AlphaBlend verwendet. Die zweite Sache ist, daß ein neues Bitmap weiß gefüllt ist und einen Alphawert von $FF für jedes Pixel besitzt. Deshalb muß es vor dem Kopieren eines Icons vollständig gelöscht werden, da sonst das Icon auf den weißen Hintergrund gerendert wird.
Da Du XE2 verwendest, habe ich das mal schnell als Class-Helper programmiert:
Delphi-Quellcode:
type
TBitmapHelper = class helper for TBitmap
procedure Clear(Color: TColor; Alpha: Byte);
end;
procedure TBitmapHelper.Clear(Color: TColor; Alpha: Byte);
type
TColor32 = packed record
case Integer of
0: (B, G, R, A: Byte);
1: (BGRA: UInt32);
end;
TColor32Array = array[0..0] of TColor32;
PColor32Array = ^TColor32Array;
var
X, Y: Integer;
R, G, B: Byte;
Line: PColor32Array;
begin
R:=GetRValue(Color);
G:=GetGValue(Color);
B:=GetBValue(Color);
for Y:=0 to Height-1 do
begin
Line:=ScanLine[Y];
for X:=0 to Width-1 do
begin
Line[X].R:=R;
Line[X].G:=G;
Line[X].B:=B;
Line[X].A:=Alpha;
end;
end;
end;
Damit funktioniert sowohl das Kopieren eines 32Bit Bildes aus einer Image-Liste in das leere Bitmap als auch dessen Ausgabe in eine Paintbox:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp:=TBitmap.Create;
try
Bmp.SetSize(50,50);
Bmp.PixelFormat:=pf32bit;
Bmp.AlphaFormat:=afDefined;
Bmp.Clear(clBlack,0);
ImageList1.Draw(Bmp.Canvas,0,0,0);
//PaintBox1.Canvas.Draw(0,0,Bmp);
PaintBox1.Canvas.StretchDraw(Rect(0,0,100,100),Bmp);
finally
Bmp.Free;
end;
end;