代码之家  ›  专栏  ›  技术社区  ›  Roel

MFC Feature Pack类菜单上的图标

  •  8
  • Roel  · 技术社区  · 17 年前

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

    • 在菜单栏中(CMCMMenuBar)
    • 在弹出菜单(CMCMCPoppMenu)中
    • 在CMCButton的“下拉菜单”版本中

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

    5 回复  |  直到 16 年前
        1
  •  4
  •   foraidt    16 年前

    我是这样让它工作的:

    第一位的

    正如其他人所说,在主工具栏旁边创建一个不可见的工具栏(我使用的是基于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_MAINFRAME IDR_MAINFRAME_256 由AppWizard生成。前者是丑陋的16色版本,后者是有趣的高色版本。
    尽管它的名字,如果我没记错的话,即使是AppWizard生成的图像也有24位色深。最酷的是:只需将其替换为32位图像,这也会奏效。

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

    笔记

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

        2
  •  2
  •   Nevermind    17 年前

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

        3
  •  2
  •   Nevermind    17 年前

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

        4
  •  2
  •   sth    16 年前

    尝试使用此功能:

    CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
       UINT uiBmpResID=0,
       UINT uiColdResID=0,
       UINT uiMenuResID=0,
       UINT uiDisabledResID=0,
       UINT uiMenuDisabledResID=0);
    

    例如:

    CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);
    

    对我来说工作得很好。

        5
  •  0
  •   Vek    16 年前

    有一件事可能会让人感到惊讶,那就是对于可定制(即非锁定)的工具栏,你制作的第一个工具栏,框架会拆分并变成程序中所有图标的某种调色板位图。如果您稍后尝试添加更多工具栏(或不同的工具栏),这些工具栏具有与第一个不同颜色深度的位图(或png),它们似乎会失败,因为它无法将它们添加到同一调色板中。

    推荐文章