我需要应用程序菜单选项的图标没有背景。我使用此代码将图标设置为菜单选项:
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);
结果是......黑色背景:
我不需要这个背景。
如何在菜单中按原样绘制此图标,没有背景?
答案 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)