Что-то вроде этого должно делать то, что вы хотите.Я предположил, что вы используете растровые изображения 32bpp, возможно, с альфа-смешиванием.Если вы хотите использовать прозрачность, основанную на маске, вам потребуется заново обработать код, чтобы создать соответствующую битовую карту маски.
procedure CopyBitmapToIcon(Bitmap: TBitmap; Icon: TIcon);
var
MonoBitmap: HBITMAP;
IconInfo: TIconInfo;
IconHandle: HICON;
begin
MonoBitmap := CreateBitmap(Bitmap.Width, Bitmap.Height, 1, 1, 0);
Try
FillChar(IconInfo, SizeOf(IconInfo), 0);
IconInfo.fIcon := True;
IconInfo.hbmMask := MonoBitmap;
IconInfo.hbmColor := Bitmap.Handle;
IconHandle := CreateIconIndirect(IconInfo);
if IconHandle=0 then begin
RaiseLastOSError;
end;
Icon.Handle := IconHandle;
Finally
DeleteObject(MonoBitmap);
End;
end;
procedure TMyForm.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
Icon: TIcon;
begin
Icon := Self.Icon;
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32bit;
Bitmap.SetSize(Icon.Width, Icon.Height);
Bitmap.Canvas.Brush.Style := bsSolid;
Bitmap.Canvas.Brush.Color := clRed;
Bitmap.Canvas.FillRect(Rect(0, 0, Icon.Width, Icon.Height));
CopyBitmapToIcon(Bitmap, Icon);
finally
Bitmap.Free;
end;
end;