Show popup Win32 menu with PNG icons from resources
It's been a long time since I had to deal with Win32 menus. I need to add some PNG icons to the context menu of a Win32 context. Naturally I want to preserve the transparency of the PNG and all the pixel alpha in the process. Is it possible?
I thought about using SetMenuItemBitmaps
. Is this the way?
I imported my PNGs as "PNG" assets, but I cannot load them with LoadBitmap
or with LoadImage
. I found a few suggestions for use Gdi+
, but obviously I won't draw the menu - the system will.
There seems to be a way to get HBITMAP
from Gdi + Bitmap
, but it looks like all alpha is lost in the process. AFAIK, a HBITMAP
can happily post alpha information.
source to share
You need GDI + to load PNG. Then you need to create a 32-bit alpha bitmap of the correct size, create the graphics in the bitmap, and use DrawImage to copy the PNG to the bitmap. This gives you a bitmap with an alpha channel.
Something like that:
Image* pimgSrc = Image::FromFile("MyIcon.png"L, FALSE);
Bitmap* pbmpImage = new Bitmap(
iWidth, iHeight,
PixelFormat32bppARGB
);
Graphics* pgraphics = Graphics::FromImage(bmpImage))
{
// This draws the PNG onto the bitmap, scaling it if necessary.
// You may want to set the scaling quality
graphics->DrawImage(
imageSrc,
Rectangle(0,0, bmpImage.Width, bmpImage.Height),
Rectangle(0,0, imgSrc.Width, imgSrc.Height),
GraphicsUnitPixel
);
}
// You can now get the HBITMAP from the Bitmap object and use it.
// Don't forget to delete the graphics, image and bitmap when done.
source to share
Perhaps you could use an icon instead?
Here are my reasons for using icons instead of PNGs:
- The Win32 API has good support icons and it is relatively easy to draw icons since no GDI + is required.
- Icons also support 8-bit transparency (like PNG).
- Icons can be any pixel size (like PNG).
- Icons can be easily embedded into an executable file as a resource.
- Icons can be edited using Visual Studio.
To load an icon from a resource or file, use:
LoadImage()
To draw an icon use:
DrawIcon() or DrawIconEx()
source to share