在MFC CMenu中绘制图标而不是位图?

时间:2008-11-06 12:29:20

标签: mfc

我可以在菜单中使用位图

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时再次询问是值得的。

5 个答案:

答案 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()周围的代码。