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