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

MFC功能包类菜单上的图标

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

    新的MFC功能(功能包)中有三个菜单显示位置:

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

    我想把图标(高颜色和超偏执)放在所有菜单中。我找到了cframewndex::ondrawmenuImage(),我可以使用它自定义在菜单栏项前面绘制图标。它不是很方便,必须在2008年实现图标绘制,但它是有效的。对于其他人,我还没有找到解决办法。有自动设置菜单图标的方法吗?

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

    这就是我让它工作的方式:

    弗斯特

    如其他人所说,在主工具栏旁边创建一个不可见的工具栏(我使用的是基于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生成了一个位图,我用我的高颜色版本替换了它。完成!

    注释

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

        2
  •  2
  •   Nevermind    16 年前

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

        3
  •  2
  •   Nevermind    16 年前

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

        4
  •  2
  •   sth Wojciech Parzych    15 年前

    尝试使用此功能:

    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    15 年前

    让人吃惊的是,对于可自定义(即非锁定)工具栏,第一个工具栏,框架被拆分成程序中所有图标的某种调色板位图。如果以后尝试添加更多的工具栏(或不同的工具栏),这些工具栏的位图(或PNG)的颜色深度与第一个工具栏的颜色深度不同,那么它们似乎会失败,因为它无法将它们添加到同一调色板中。