【问题标题】:Icons on menus of MFC Feature Pack classesMFC Feature Pack 类菜单上的图标
【发布时间】:2010-09-09 09:09:36
【问题描述】:

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

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

我想将图标(高颜色和透明)放在所有菜单中。我发现 CFrameWndEx::OnDrawMenuImage() 可以用来自定义在菜单栏项目前面绘制图标。这不是很方便,必须在2008年实现图标绘制,但它可以工作。对于其他人,我还没有找到解决方案。有没有一种自动设置菜单图标的方法?

【问题讨论】:

  • 那么通过下面的答案,您已经能够将图标添加到顶级菜单项(如通常的文件、编辑、查看、帮助项)?谢谢!

标签: mfc mfc-feature-pack


【解决方案1】:

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

首先

,正如其他人所说,在您的主工具栏旁边创建一个不可见的工具栏(我使用的是基于 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); - 如果没有这条线,由于某种原因,我的应用程序会在关闭时挂起!
  • 另外,请务必在工具栏上调用:m_wndInvisibleToolBar.SetMaskMode( true );,否则它将在您的工具/自定义命令(例如您的 CMFCToolBarsCustomizeDialog 对象)中显示为不可编辑的工具栏。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      试试这个功能:

      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】:

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

        【讨论】:

          猜你喜欢
          • 2011-07-06
          • 2011-06-20
          • 2011-03-20
          • 2011-03-02
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多