我可以在菜单中使用位图
CMenu men;
CBitmap b;
b.LoadBitmap(IDB_0);
men.AppendMenu( MF_ENABLED,1,&b);
我可以在DC中绘制一个图标
CImageList IL;
IL.Create(70, 14, ILC_COLOR16 | ILC_MASK, 1, 0);
IL.Add(AfxGetApp()->LoadIcon(IDI_0));
IL.Draw ( pDC, 0, rcIcon.TopLeft(), ILD_BLEND50 );
但是我找不到在菜单中显示图标的简单方法。我想这样做
CMenu men;
CBitmap b;
// here the miracle happens, load the icon into the bitmap
men.AppendMenu( MF_ENABLED,1,&b);
这似乎应该是可能的。
这与this的问题相同。然而,这个问题提到了MFC功能包,没有得到解答,并且在一个月内没有显示任何活动,所以我认为在参考基本MFC时再次询问是值得的。
答案 0 :(得分:4)
我问你提到的问题。
向菜单添加(普通,16位颜色)图标的方法是使工具栏具有与您想要图标的菜单相同的资源ID。然后将id分配给每个工具栏按钮,与菜单条目相同的ID。制作一个向导生成的新MFC应用程序,你会看到它是如何工作的。
我发布的问题的答案表明,对于Feature Pack工具栏具有透明度的32位图像,它应该是相同的。我没有去试试它。
如果您的具体问题是如何制作动态生成的菜单,我认为您应该传递工具栏中现有条目的ID,然后将使用该图像。
不是你问题的真实答案,但也许它会指出你正确的方向。
答案 1 :(得分:0)
好的代码。请注意,这会显示位图图像,但如果要显示图像,则最好删除字符串左侧的空白区域(用于检查/取消选中)。 我确实喜欢这个。
MENUINFO mi;
mi.cbSize = sizeof(mi);
mi.fMask = MIM_STYLE;
mi.dwStyle = MNS_NOCHECK;
pcSubMenu->SetMenuInfo(&mi);
MENUITEMINFO mii;
mii.cbSize = sizeof mii;
mii.fMask = MIIM_BITMAP;
mii.hbmpItem = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_16_HELP),IMAGE_BITMAP,0,0,LR_SHARED |LR_VGACOLOR |LR_LOADTRANSPARENT);
pcSubMenu->SetMenuItemInfo(ID_CONTENTS,&mii,FALSE);
答案 2 :(得分:0)
我认为你所寻找的与这里描述的非常相似...... www.codeguru.com/cpp/controls/menu/bitmappedmenus/article.php/c165 /
与www.codeproject.com/KB/shell/DynIcon.aspx中描述的内容混合
仍然要看它是否会奏效。
驯
答案 3 :(得分:0)
在Windows Vista / Windows7上,您不能这样做,它可能是32 BGRA图像,或者菜单未以新UI样式绘制。没有解决方法,也许是ownerdrawing但我读的样式API与菜单无法正常工作,所以我从未试图深入了解它。
无论如何你应该使用32位BGRA图标。
答案 4 :(得分:-1)
为了设置菜单的位图,你需要为每个项目调用CMenu :: SetMenuItemInfo(),如下所示:
MENUITEMINFO mii;
mii.cbSize = sizeof mii;
mii.fMask = MIIM_BITMAP;
mii.hbmpItem = bitmapHandle;
menu.SetMenuItemInfo(menuItem,&mii,TRUE);
这样做的另一个复杂因素是这对于256色位图是可以的,但不是全彩色32位RGBA位图 - 这些将起作用,但仅适用于Vista,然后仅当您将位图呈现为预先计算的RGBA时。
实际上,在我的代码中,我通过使用菜单图标的另一个功能来解决这个问题,即将hbmpItem设置为HBMMENU_CALLBACK,这允许回调绘制位图:我为Windows XP和之前做过。这里的代码有点太复杂了。例如,您可以查看我的代码
http://www.ifarchive.org/if-archive/infocom/interpreters/frotz/WindowsFrotzSrc.zip
查看“MenuBar.h”和“MenuBar.cpp”,特别是MenuBar :: SetBitmaps()周围的代码。