[DUG] Assigned image to SpeedButton not transparent

Dennis Chuah dennis_cs_chuah at hotmail.com
Fri Oct 30 22:36:33 NZDT 2015

I seem to recall Delphi 7 having transparency issues with Image Lists ... in 
any case Windows GDI does not handle transparency very well.

Also, check that your image list is actually holding a transparent bitmap. 
Simply loading it from a resource or stream will not preserve the 
transparency information.

Furthermore, TSpeedButton does not play nice with image lists.  I use this 
code because it creates a wide bitmap for the different button states.

  Glyph: TBitmap;
  w: Integer;

  Glyph := SpeedButton.Glyph;
  Glyph.PixelFormat := pf32bit; // The default is pfDevice which does not 
support transparency
  w := ImageList.Width;
  Glyph.Width :=  w * 4 {NumberOfImages};
  Glyph.Height := ImageList.Width;
  // Normal image
  ImageList.Draw (Glyph.Canvas, 0, 0, NormalIndex);
  // Disabled image
  ImageList.Draw (Glyph.Canvas, w, 0, DisabledIndex);
  // Clicked image
  ImageList.Draw (Glyph.Canvas, w * 2, 0, ClickedIndex);
  // Down image
  ImageList.Draw (Glyph.Canvas, w * 3, 0, DownIndex);


-----Original Message----- 
From: Ross Levis
Sent: Friday, October 30, 2015 3:51 PM
To: 'NZ Borland Developers Group - Delphi List'
Subject: [DUG] Assigned image to SpeedButton not transparent

Using D7/themes, I have a TSpeedButton which is a toggle and I need to 
display 2 different glyphs in a TSpeedButton based on whether the button was 
clicked or right-clicked, as they do 2 slightly different things.

So I need to assign a glyph to the button at run time, which works, but 
nothing I do makes the image transparent. There is always a white square 
with the icon in the middle. It only looks correct if I assign one of the 
images to the Glyph property at design time.

I use a TImageList to store the 2 images, and assign them like this as 

BitMap := TBitMap.Create;


SpeedButton.Glyph := BitMap;


where n is 0 or 1.

I've tried setting Bitmap.Transparent to true and other combinations like 
TransparentMode and TransparentColor but nothing makes any difference.

There is some sort of transparency happening since the images have quite a 
colorful background but this appears as white on the button.

As a test I assigned the image from a filename Button.Glyph.LoadFromFile() 
and this works correctly and looks good, but I don't want to distribute BMP 
files separately.

A possible alternative I haven’t tried is embedding the 2 images as a 
resource in the EXE file and using Button.Glyph.LoadFromResourceName (or 
ResourceID), but that seems a lot of work.  I thought I would try here to 
see if anyone knows how to resolve the current method.



NZ Borland Developers Group - Delphi mailing list
Post: delphi at listserver.123.net.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-request at listserver.123.net.nz with 
Subject: unsubscribe 

More information about the Delphi mailing list