MFC Feature Pack类菜单上的图标

时间:2008-09-16 08:34:36

标签: mfc mfc-feature-pack

新MFC功能(Feature Pack)中有三个菜单显示:

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

我想在所有菜单中添加图标(高色和透明)。我找到了CFrameWndEx :: OnDrawMenuImage(),我可以使用它来自定义菜单栏项目前面的图标。这不是很方便,不得不在2008年实施图标绘制,但它确实有效。对于其他人,我还没有找到解决方案。是否有自动设置菜单图标的方法?

5 个答案:

答案 0 :(得分: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。前者是丑陋的16色版本,后者是有趣的高色版本 尽管它的名字,如果我没记错的话,即使AppWizard生成的图像也有24位颜色深度。很酷的事情:只需用32位图像替换它,这也会起作用。

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

注意

不要使用资源编辑器打开工具栏:它可能必须先将其转换为4位才能对其执行任何操作。甚至如果你让它这样做(因为,在Visual Studio的背后,你将再次用高彩色图像替换结果,哈哈!),我发现它(有时?)根本无法编辑工具栏。很奇怪。
在这种情况下,我建议直接编辑.rc文件。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

在BCGToolbar中,足以在资源和资源中创建一个工具栏。加载它(但不显示窗口),但工具栏按钮必须与要链接它的菜单项具有相同的ID。

答案 3 :(得分: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);

对我来说非常好。

答案 4 :(得分:0)

可以让人惊讶的一件事是,对于可自定义(即非锁定)工具栏,您制作的第一个工具栏,框架会分割并转换为程序中所有图标的某种调色板位图。如果您尝试添加更多工具栏(或不同的工具栏),其位图(或png)的颜色深度与第一个不同,则它们似乎失败,因为它无法将它们添加到同一个调色板中。