This can be done be creating an additional bitmap (Intrans) whose alpha chanel is set to 0.
Intrans is used for ImageList.Add as image the original bitmap as Mask.
The example should reflect yours.
type
pRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray = ARRAY [0 .. 0] OF TRGBQuad;
Procedure GenIntransparentBitmap(bmp, Intrans: TBitmap);
var
pscanLine32: pRGBQuadArray;
i, j: Integer;
begin
Intrans.Assign(bmp);
for i := 0 to Intrans.Height - 1 do
begin
pscanLine32 := Intrans.Scanline[i];
for j := 0 to Intrans.Width - 1 do
begin
pscanLine32[j].rgbReserved := 0;
end;
end;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
Bitmap, Intransp: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32bit;
Bitmap.Transparent := true;
Bitmap.AlphaFormat := afIgnored;
SetBkMode(Bitmap.Canvas.Handle, BKMODE_LAST);
Bitmap.SetSize(100, 42);
ImageList1.Draw(Bitmap.Canvas, 5, 5, 0, dsTransparent, itImage);
Bitmap.Canvas.Brush.Style := bsClear;
Bitmap.Canvas.RoundRect(0, 0, 99, 41, 5, 5);
Bitmap.Canvas.TextOut(50, 5, 'Test string');
BitmapImageList.Width := Bitmap.Width;
BitmapImageList.Height := Bitmap.Height;
// Create intransparent bitmap from transparent bitmap
Intransp := TBitmap.Create;
try
GenIntransparentBitmap(Bitmap, Intransp);
// add intransparent bitmap as image and transparent bitmap as mask
BitmapImageList.Add(Intransp, Bitmap);
finally
Intransp.Free;
end;
BitmapImageList.Draw(Canvas, 100, 100, 0);
finally
Bitmap.Free;
end;
end;
A shorter version would be
Procedure GenIntransparentBitmap(bmp, Intrans: TBitmap);
begin
Intrans.Assign(bmp);
Intrans.PixelFormat := pf24bit;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
Bitmap, Intransp: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32bit;
SetBkMode(Bitmap.Canvas.Handle, TRANSPARENT);
Bitmap.SetSize(100, 42);
ImageList1.Draw(Bitmap.Canvas, 5, 5, 0, dsTransparent, itImage);
Bitmap.Canvas.Brush.Style := bsClear;
Bitmap.Canvas.RoundRect(0, 0, 99, 41, 5, 5);
Bitmap.Canvas.TextOut(50, 5, 'Test string');
BitmapImageList.Width := Bitmap.Width;
BitmapImageList.Height := Bitmap.Height;
// Create intransparent bitmap from transparent bitmap
Intransp := TBitmap.Create;
try
GenIntransparentBitmap(Bitmap, Intransp);
// add intransparent bitmap as image and transparent bitmap as mask
BitmapImageList.Add(Intransp, Bitmap);
finally
Intransp.Free;
end;
BitmapImageList.Draw(Canvas, 100, 100, 0);
finally
Bitmap.Free;
end;
end;