MFC功能包类菜单上的图标

MFC功能包类菜单上的图标,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,在新的MFC功能(功能包)中有三个地方显示菜单: 在菜单栏中(CMFCMenuBar) 在弹出菜单中(CMFCPopupMenu) 在CMFCButton的“下拉菜单”版本中 我想把图标(高颜色和透明)在所有的菜单中。我找到了CFrameWndEx::OnDrawMenuImage(),我可以使用它自定义在菜单栏项前面绘制图标。它不是很方便,必须在2008年实现图标绘制,但它可以工作。对于其他人,我还没有找到解决办法。有没有自动设置菜单图标的方法?我相信(但我可能错了)这些类与微软收购BCG

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

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

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

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

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

一件让人吃惊的事情是,可定制(即,非锁定)工具栏按钮工具栏,你制作的第一个工具栏,框架被拆分成程序中所有图标的调色板位图。如果您稍后尝试添加更多具有不同颜色深度的位图(或PNG)的工具栏(或不同的工具栏),它们似乎会失败,因为无法将它们添加到同一调色板。

我就是这样做的:

弗斯特 ,正如其他人所说,在主工具栏旁边创建一个不可见的工具栏(我使用基于AppWizard名称的常用名称):

第二:图像和工具栏资源
IDR\u大型机
IDR\u大型机_256
由AppWizard生成。前者是丑陋的16色版本,后者是有趣的高色版本。
尽管它的名字,如果我没记错的话,即使是AppWizard生成的图像也有24位的颜色深度。最酷的事情是:只要用32位图像替换它,那也行

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

注 不要使用资源编辑器打开工具栏:它可能必须先将其转换为4位,然后才能对其执行任何操作。即使你让它这样做(因为,在Visual Studio的背后,我们将再次用高颜色图像替换结果,哈!),我发现它(有时?)根本无法编辑工具栏。非常奇怪。

在这种情况下,我建议直接编辑.rc文件。

尝试使用此功能:

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

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

对我来说效果很好。

谢谢,这对我来说很好,但我必须在m_wndInvisibleToolbar.LoadToolBar()之后添加以下行:m_wndInvisibleToolbar.ShowPane(FALSE,FALSE,FALSE);-如果没有那行代码,我的应用程序在关闭时会因为某种原因挂起!此外,确保调用:
m_wndInvisibleToolBar.SetMaskMode(true),否则它将在您的工具/自定义命令中显示为不可编辑的工具栏(例如,您的CMFCToolBarsCustomizeDialog对象)。因此,通过下面的答案,您可以将图标添加到顶级菜单项(如常用的文件、编辑、查看、帮助项)?谢谢
CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);