MFC功能包类的菜单图标

8

在新的MFC功能(Feature Pack)中,菜单出现在三个位置:

  • 菜单栏中(CMFCMenuBar)
  • 弹出菜单中(CMFCPopupMenu)
  • 在CMFCButton的“下拉菜单”版本中

我想在所有这些菜单中放置带有透明度的高彩色图标。我找到了CFrameWndEx :: OnDrawMenuImage()方法,可以用它来自定义绘制菜单栏项目前面的图标。虽然在2008年实现图标绘制不是很方便,但它确实可行。至于其他两种情况,我还没有找到解决方案。是否有一种自动设置菜单图标的方法?


所以,根据下面的答案,您已经成功地将图标添加到顶级菜单项(例如常见的“文件”,“编辑”,“查看”,“帮助”项目)了?谢谢! - Marcel N.
5个回答

4
这是我让它正常工作的方法:

第一步

像其他人说的那样,在主工具栏旁边创建一个不可见的工具栏(我使用了基于AppWizard名称的通用名称):

MainFrm.h:
class CMainFrame
{
    //...    
    CMFCToolBar m_wndToolBar;
    CMFCToolBar m_wndInvisibleToolBar;
    //...
};

MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //...

    // Normal, visible toolbar
    if(m_wndToolBar.Create(this,
        TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        VERIFY( m_wndToolBar.LoadToolBar(
            theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME) );

        // Only the docking makes the toolbar visible
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndToolBar);
    }

    // Invisible toolbar; simply calling Create(this) seems to be enough
    if(m_wndInvisibleToolBar.Create(this))
    {
        // Just load, no docking and stuff
        VERIFY( m_wndInvisibleToolBar.LoadToolBar(IDR_OTHERTOOLBAR) );
    }
}

第二步:图片和工具栏资源

IDR_MAINFRAMEIDR_MAINFRAME_256 是由 AppWizard 生成的。前者是丑陋的16色版本,后者是有趣的高彩色版本。
尽管它的名称如此,但如果我没记错,即使是 AppWizard 生成的图像也具有24位颜色深度。很酷的是:只需用32位图像替换它,那也可以正常工作。

还有一个看不见的工具栏 IDR_OTHERTOOLBAR:我使用资源编辑器创建了一个带有虚拟图标和命令ID的工具栏。然后VS生成了一个位图,我用我的高彩色版本替换了它。完成!

注意

不要使用资源编辑器打开工具栏:它可能需要将其转换为4位才能对其进行任何操作。而且,即使您让它这样做(因为在 Visual Studio 的背后,您将再次用高彩色图像替换结果),我发现它(有时候?)无法编辑工具栏。非常奇怪。
在这种情况下,我建议直接编辑 .rc 文件。


谢谢,这对我有用,但我必须在m_wndInvisibleToolbar.LoadToolBar()之后添加以下行:m_wndInvisibleToolbar.ShowPane(FALSE, FALSE, FALSE); - 如果没有这行,由于某种原因,我的应用程序会在关闭时挂起! - AshleysBrain
此外,请确保在工具栏上调用:m_wndInvisibleToolBar.SetMaskMode( true );,否则它将显示为无法编辑的工具栏,出现在您的“工具/自定义”命令(例如,您的CMFCToolBarsCustomizeDialog对象)中。 - johnwbyrd

2
尝试使用这个函数:
CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

所以例如:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

对我非常有效。


2
在BCGToolbar中,只需要在资源中创建一个工具栏并加载它(但不显示窗口),但是工具栏按钮的ID必须与您想要链接它的菜单项相同。

2

我相信(但我可能是错的)这些类与微软在收购BCG时包含在MFC中的BCGToolbar类相同。如果是这样,您可以创建一个工具栏,并在工具栏按钮上使用与要创建图标的菜单项相同的ID,它们应该会自动显示。当然,您不必实际显示工具栏。


0
一个可能会让人感到意外的事情是,对于可定制(即非锁定)工具栏而言,你所创建的第一个工具栏,框架会将其分割并转换成程序中所有图标的调色板位图。如果你稍后尝试添加更多工具栏(或不同的工具栏),这些工具栏的位图(或png)与第一个工具栏的颜色深度不同,它们似乎会失败,因为不能将它们添加到同一调色板中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接