如何在 Delphi 5 中将具有背景色的位图加载到 TImageList 中?

How to load a bitmap, with background color, into a TImageList in Delphi 5?

精简版

填写函数:

procedure LoadImageListMasked(AImageList: TImageList; hbmp: HBITMAP; TransparentColor: TColor);
var
   bmp: Graphics.TBitmap;
begin
   bmp := Graphics.TBitmap.Create;
   bmp.Handle := hbmp;
   bmp.Transparent := True;
   bmp.TransparentMode := tmFixed;
   bmp.TransparentColor := TransparentColor;
   AImageList.AddMasked(bmp, TransparentColor);
   bmp.Free;
end;

长版

我有一个 256 色位图的句柄 (hbmp):

我想在 (Delphi 5) TImageList 中加载此图像,使用 clFuchsia 作为遮罩颜色:

var
   bmp: TGraphics.TBitmap;

   bmp := TBitmap.Create;
   bmp.Transparent := True;           //Default: False
   bmp.TransparentMode  := tmFixed;   //Default: tmAuto
   bmp.TransparentColor := clFuchsia; //Default: FF00FF
   bmp.Handle := hbmp;

   ImageList1.Clear;
   ImageList1.Height := bmp.Height;
   ImageList1.Width := bmp.Height;
   ImageList1.BkColor := clNone;      //Default: FFFFFFF (clNone)
   ImageList1.AddMasked(bmp, clFuchsia);

除非我实际 使用 图像列表中的图像(在 TToolbar 上),clFuchsia 颜色未被屏蔽:

我做错了什么?

选项网格

有多种选择可供选择:

让我们试试我能想到的每一种组合:

TransparentMode TransparentColor BkColor Result
tmAuto (default) -1 (default) clFuchsia Fail
tmAuto (default) -1 (default) clNone (default) Fail
tmFixed clFuchsia clNone (default) Fail
tmAuto (default) -1 (default) clNone (default) then assign the handle:
tmAuto (default) FF00FF (auto) clNone (default) Fail
tmAuto (default) -1 (default) clNone (default) then assign the handle:
tmAuto (default) FF00FF (auto) clNone (default) then change Mode to tmFixed:
tmFixed FF00FF (auto) clNone (default) Fail
tmAuto (default) -1 (default) clNone (default) then assign the handle:
tmAuto (default) FF00FF (auto) clNone (default) then change mode to tmFixed:
tmFixed FF00FF (auto) clNone (default) then change TransparentColor to clFuchsia:
tmFixed FF00FF (clFuchsia) clNone (default) Fail

通过 VCL 追踪后,我意识到还有另一个 属性 of TBitmap:

TBitmap.Transparent: Boolean

默认为False。我现在也尝试将其设置为 True.

不要设置 TImageList.BkColor,保留其默认值 clNone。您告诉 TImageList 以固定颜色将其蒙版位图绘制到 TToolbar 上。这就是为什么您的 TToolBar 显示紫红色。显示的是 TImageList.BkColor,而不是 TBitmap.TransparentColor


此外,仅供参考...

如果您想要特定的 TransparentColor,请不要将 TBitmap.TransparentMode 属性 设置为 tmAuto

TransparentColor 属性 设置为 clDefault 以外的值会将 TransparentMode 属性 设置为 tmFixed。然后将 TransparentMode 设置回 tmAuto 会将 TransparentColor 设置回 crDefault,从而失去您的颜色选择。

不过,这并不重要,因为在内部 AddMasked() 创建了一个从源 TBitmap 复制的新 TBitmap,并且它将设置复制位图的 TransparentColor 到您指定的输入 TColor,因此您实际上根本不需要使源 TBitmap 透明。