2008-11-06 157 views
2

我可以在菜单在MFC CMenu中绘制图标而不是位图?

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。

回答

4

我问你提到的问题。

向菜单添加(普通,16位颜色)图标的方法是制作一个工具栏,其中包含与您想要插入图标的菜单相同的资源ID。然后,将id分配给每个工具栏按钮,与菜单条目相同的ID。制作一个向导生成的新MFC应用程序,您将看到它在那里的工作原理。

我发布的问题的答案表明它应该对Feature Pack工具栏具有透明度的32位图像具有相同的功能;尽管如此,我还没有到处去测试它。

如果您的具体问题是如何制作动态生成的菜单,我认为您应该传递工具栏中现有条目的ID,然后使用该图像。

不是你的问题的真正答案,但也许它会指出你在正确的方向。

+0

谢谢。这听起来像它可能工作。但是,它似乎相当复杂,尤其是因为我之前没有使用过工具栏。现在,我会坚持我目前的解决方法 - 为每个图像存储位图和图标。叹! – ravenspoint 2008-11-06 14:05:11

-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”,特别是围绕菜单栏:: SetBitmaps()的代码。

+0

你似乎误解了这个问题。我知道如何在菜单中使用位图(使用更简单的方法,发布在我的问题中)。我希望能找到如何以同样简单的方法使用图标。 – ravenspoint 2008-11-06 16:40:57

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); 
0

我想你在找什么是非常相似,这里所描述的... ... www.codeguru。COM/CPP /控制/菜单/ bitmappedmenus/article.php/C165/

混有什么在www.codeproject.com/KB/shell/DynIcon.aspx

描述还是要看看它是否会工作。

0

在Windows Vista/Windows7的,你不能这样做,这是在32 BGRA图像或菜单没有在新的UI风格绘制。有没有解决方法,也许ownerdrawing,但我读风格的API不能正常工作的菜单,所以我从来没有试图让它更深入。

无论如何,您应该使用32位BGRA图标。