使用资源中的PNG图标显示Win32弹出菜单

时间:2012-03-28 11:29:30

标签: c++ winapi

自从我不得不处理Win32菜单以来已经有很长一段时间了。我需要在Win32上下文弹出菜单中添加一些PNG图标。当然,我希望在此过程中保留PNG透明度和所有每像素alpha。这可能吗?

我在考虑使用SetMenuItemBitmaps。这是要走的路吗?

我将PNG作为“PNG”资源导入,但我似乎无法使用LoadBitmapLoadImage加载它们。我发现了一些关于使用Gdi+的建议,但显然我不会绘制菜单 - 系统会。

似乎有办法从Gdi + HBITMAP获得Bitmap,但看起来好像所有的alpha都在这个过程中迷失了。 AFAIK,HBITMAP可以愉快地托管alpha信息。

2 个答案:

答案 0 :(得分:3)

您需要GDI +才能加载PNG。然后,您需要创建一个正确大小的32位alpha位图,在位图上创建一个Graphics,并使用DrawImage将PNG复制到位图。这会为您提供带有Alpha通道的位图。

这样的事情:

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.

答案 1 :(得分:1)

也许您可以使用图标代替?

以下是我使用图标而不是PNG的原因:

  1. Win32 API具有良好的支持图标,绘制图标相对容易得多,因为不需要GDI +。
  2. 图标还支持8位透明度(就像PNG一样)。
  3. 图标可以是任意大小的像素(就像PNG一样)。
  4. 图标可以轻松地作为资源嵌入可执行文件中。
  5. 可以通过Visual Studio编辑图标。
  6. 要从资源或文件中加载图标,请使用:

    LoadImage()
    

    要绘制图标,请使用:

    DrawIcon() or DrawIconEx()