如何在 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
颜色未被屏蔽:
我做错了什么?
选项网格
有多种选择可供选择:
bmp.TransparentMode
:[tmAuto
,tmFixed
](默认值:tmAuto
)
bmp.TransparentColor
:TColor(默认值:-1)
bmp.Transparent
:布尔值(默认值:假)
ImageList1.BkColor
:TColor(默认值:clNone
)
让我们试试我能想到的每一种组合:
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
透明。
精简版
填写函数:
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
颜色未被屏蔽:
我做错了什么?
选项网格
有多种选择可供选择:
bmp.TransparentMode
:[tmAuto
,tmFixed
](默认值:tmAuto
)bmp.TransparentColor
:TColor(默认值:-1)bmp.Transparent
:布尔值(默认值:假)ImageList1.BkColor
:TColor(默认值:clNone
)
让我们试试我能想到的每一种组合:
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
透明。