Short Version
Fill in the fuction:
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;
Long Version
I have a handle (hbmp
) to a 256-color bitmap:
I want to load this image in a (Delphi 5) TImageList, using the clFuchsia
as the mask color:
var
bmp: TGraphics.TBitmap;
bmp := TBitmap.Create;
bmp.Transparent := True; //Default: False
bmp.TransparentMode := tmFixed; //Default: tmAuto
bmp.TransparentColor := clFuchsia; //Default: $02FF00FF
bmp.Handle := hbmp;
ImageList1.Clear;
ImageList1.Height := bmp.Height;
ImageList1.Width := bmp.Height;
ImageList1.BkColor := clNone; //Default: $1FFFFFFF (clNone)
ImageList1.AddMasked(bmp, clFuchsia);
Except when I actually use the images in the image list (on a TToolbar say), the clFuchsia
color isn't masked off:
What am i doing wrong?
Options Grid
There are various options available to be played with:
bmp.TransparentMode
: [tmAuto
,tmFixed
] (Default:tmAuto
)bmp.TransparentColor
: TColor (Default: -1)bmp.Transparent
: Boolean (Default: False)ImageList1.BkColor
: TColor (Default:clNone
)
Lets try every combination i can think of:
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) | $02FF00FF (auto) | clNone (default) | Fail |
tmAuto (default) | -1 (default) | clNone (default) | then assign the handle: |
tmAuto (default) | $02FF00FF (auto) | clNone (default) | then change Mode to tmFixed: |
tmFixed | $02FF00FF (auto) | clNone (default) | Fail |
tmAuto (default) | -1 (default) | clNone (default) | then assign the handle: |
tmAuto (default) | $02FF00FF (auto) | clNone (default) | then change mode to tmFixed: |
tmFixed | $02FF00FF (auto) | clNone (default) | then change TransparentColor to clFuchsia: |
tmFixed | $02FF00FF (clFuchsia) | clNone (default) | Fail |
After tracing through the VCL i realized there is another property of TBitmap:
TBitmap.Transparent: Boolean
It defaults to False. I've now also tried setting it to True.
CodePudding user response:
Don't set the TImageList.BkColor
, leave it at its default of clNone
. You are telling the TImageList
to draw its masked bitmaps onto the TToolbar
over a fixed color. That is why your TToolBar
is showing fuchsia. It is the TImageList.BkColor
being shown, not the TBitmap.TransparentColor
.
Also, just as an FYI...
Don't set the TBitmap.TransparentMode
property to tmAuto
if you want a specific TransparentColor
.
Setting the TransparentColor
property to a value other than clDefault
will set the TransparentMode
property to tmFixed
. Then setting the TransparentMode
back to tmAuto
will set the TransparentColor
back to crDefault
, thus losing your color choice.
Though, it shouldn't really matter, as internally AddMasked()
creates a new TBitmap
copied from the source TBitmap
, and it will set the copied bitmap's TransparentColor
to the input TColor
you specify, so you don't actually need to make your source TBitmap
be transparent at all.