加载带透明度的图标到托盘菜单的应用程序

时间:2017-07-15 10:49:08

标签: c++ image winapi

我需要应用程序菜单选项的图标没有背景。我使用此代码将图标设置为菜单选项:

HICON PowerIcon = (HICON)LoadImageA(hInstance, MAKEINTRESOURCEA(POWERBTN),IMAGE_ICON,24,24,LR_LOADTRANSPARENT);
HICON ResetIcon = (HICON)LoadImageA(hInstance, MAKEINTRESOURCEA(RESETBTN),IMAGE_ICON,24,24,LR_LOADTRANSPARENT);
//    HICON PowerIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(POWERBTN));
//    HICON ResetIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(RESETBTN));
ICONINFO PowerII, ResetII;
GetIconInfo(PowerIcon, &PowerII);
GetIconInfo(ResetIcon, &ResetII);
HBITMAP PB = PowerII.hbmColor;
HBITMAP RB = ResetII.hbmColor;
SetMenuItemBitmaps(PopupMenu, TRAY_EXIT, MF_BYCOMMAND, PB, PB);
SetMenuItemBitmaps(PopupMenu, TRAY_RESTART, MF_BYCOMMAND, RB, RB);

结果是......黑色背景:

buttons

我不需要这个背景。

如何在菜单中按原样绘制此图标,没有背景?

1 个答案:

答案 0 :(得分:1)

菜单透明显示DIB部分位图而不是兼容的位图。最好和最简单的选择 - 使用通过LoadImage( , IMAGE_BITMAP, .. LR_CREATEDIBSECTION)创建的32bpp位图。尝试使用和不使用LR_CREATEDIBSECTION标志创建的测试位图(在菜单中)并查看不同的内容。

如果您在资源而不是位图中有图标,则在我的测试中GetIconInfo不返回DIB部分位图,如果没有透明显示。可能的方式 - 你自己从图标资源创建DIB部分位图,而不是使用LoadIcon + GetIconInfo。

HBITMAP CreateDIBfromIcon(PCWSTR lpName, int cxDesired, int cyDesired)
{
    union {
        PVOID pv;
        PBYTE pb;
        PBITMAPINFOHEADER pbih;
    };

    if (HRSRC hrs = FindResource((HMODULE)&__ImageBase, lpName, RT_GROUP_ICON))
    {
        if (pv = LoadResource((HMODULE)&__ImageBase, hrs))
        {
            if (int i = LookupIconIdFromDirectoryEx(pb, TRUE, cxDesired, cyDesired, 0))
            {
                if (hrs = FindResource((HMODULE)&__ImageBase, MAKEINTRESOURCE(i), RT_ICON))
                {
                    if (pv = LoadResource((HMODULE)&__ImageBase, hrs))
                    {
                        if (pbih->biBitCount == 32)
                        {
                            BITMAPINFOHEADER bih = *pbih;
                            bih.biHeight >>= 1;
                            PVOID pvBits;

                            if (HBITMAP hbmpItem = CreateDIBSection(0, (PBITMAPINFO)&bih, DIB_RGB_COLORS, &pvBits, 0, 0))
                            {
                                memcpy(pvBits, pb + pbih->biSize, 4*pbih->biWidth*pbih->biHeight);
                                return hbmpItem;
                            }
                        }
                    }
                }
            }
        }
    }

    return 0;
}

在你的情况下需要使用 CreateDIBfromIcon(MAKEINTRESOURCE(POWERBTN), 24, 24)CreateDIBfromIcon(MAKEINTRESOURCE(RESETBTN), 24, 24)