MFC Feature Pack类菜单上的图标
新的MFC功能(功能包)在三个位置显示菜单:
- 在菜单栏中(CMFCMenuBar)
- 在弹出菜单(CMFCPopupMenu)中
- 在"下拉菜单"版本的CMFCButton中
我想在所有菜单中放入图标(彩色和透明)。我找到了CFrameWndEx :: OnDrawMenuImage(),可以用来自定义在菜单栏项目前面绘制图标。它不是很方便,必须在2008年实现图标绘制,但是可以。对于其他人,我还没有找到解决方案。是否有一种自动设置菜单图标的方法?
解决方案
回答
我相信(但我可能错了),这些类与Microsoft购买BCG时MFC中包含的BCGToolbar类相同。如果是这样,我们可以创建一个工具栏,并在工具栏按钮上使用与我们要为其创建图标的菜单项中相同的ID,并且它们应自动出现。当然,我们不必实际显示工具栏。
回答
在BCGToolbar中,足以在资源中创建工具栏并加载它(但不显示窗口),但是工具栏按钮必须具有与要链接到的菜单项相同的ID。
回答
让人惊讶的一件事是,对于可定制(即非锁定)的工具栏,即我们制作的第一个工具栏,框架拆分并变成程序中所有图标的某种调色板位图。如果我们以后尝试添加更多的工具栏(或者其他工具栏),这些工具栏的位图(或者png)的颜色深度与第一个不同,则它们似乎失败了,因为无法将它们添加到同一调色板中。
回答
这是我如何使其工作的方式:
第一的
,就像其他人所说的,在主工具栏旁边创建一个不可见的工具栏(我使用的是基于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文件。
回答
尝试使用此功能:
CMFCToolBar::AddToolBarForImageCollection(UINT uiResID, UINT uiBmpResID=0, UINT uiColdResID=0, UINT uiMenuResID=0, UINT uiDisabledResID=0, UINT uiMenuDisabledResID=0);
因此:
CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);
对我来说做得很好。