Ваш код не работает, потому что вы потеряли всю информацию о прозрачности при использовании GetBitmap()
. Вместо этого вам придется рисовать растровое изображение вручную, например:
uses
..., Winapi.CommCtrl;
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
var
i: integer;
begin
// make sure your ImageList is set to ColorDepth=cd32bit and DrawingStyle=dsTransparant beforehand...
Bitmap.SetSize(ImageList.Width, ImageList.Height);
Bitmap.PixelFormat := pf32bit;
if (ImageList.ColorDepth = cd32Bit) then
begin
Bitmap.Transparent := False;
Bitmap.AlphaFormat := afDefined;
end
else
Bitmap.Transparent := True;
for i := 0 to Bitmap.Height-1 do
FillChar(Bitmap.ScanLine[i]^, Bitmap.Width*SizeOf(DWORD), $00);
ImageList_Draw(ImageList.Handle, Index, Bitmap.Canvas.Handle, 0, 0, ILD_TRANSPARENT);
end;
В качестве альтернативы:
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
begin
Bitmap.PixelFormat := pf32bit;
Bitmap.Canvas.Brush.Color := clFuschia;
Bitmap.SetSize(ImageList.Width, ImageList.Height);
ImageList.Draw(Bitmap.Canvas, 0, 0, AIndex, dsTransparent, itImage);
Bitmap.Transparent := True;
Bitmap.TransParentColor := clFuchsia;
Bitmap.TransparentMode := tmAuto;
end;
Тогда вы можете сделать это:
var
NewItem: TMenuItem;
begin
NewItem := TMenuItem.Create(pmSendToCustomTool);
NewItem.Caption := ThisCaption;
GetTransparentBitmapFromImageList(MySystemImageList1, AIndex, NewItem.Bitmap);
CodeSite.Send('NewItem.Bitmap', NewItem.Bitmap);
end;