在新的MFC功能(Feature Pack)中,菜单出现在三个位置:
- 菜单栏中(CMFCMenuBar)
- 弹出菜单中(CMFCPopupMenu)
- 在CMFCButton的“下拉菜单”版本中
我想在所有这些菜单中放置带有透明度的高彩色图标。我找到了CFrameWndEx :: OnDrawMenuImage()方法,可以用它来自定义绘制菜单栏项目前面的图标。虽然在2008年实现图标绘制不是很方便,但它确实可行。至于其他两种情况,我还没有找到解决方案。是否有一种自动设置菜单图标的方法?
在新的MFC功能(Feature Pack)中,菜单出现在三个位置:
我想在所有这些菜单中放置带有透明度的高彩色图标。我找到了CFrameWndEx :: OnDrawMenuImage()方法,可以用它来自定义绘制菜单栏项目前面的图标。虽然在2008年实现图标绘制不是很方便,但它确实可行。至于其他两种情况,我还没有找到解决方案。是否有一种自动设置菜单图标的方法?
像其他人说的那样,在主工具栏旁边创建一个不可见的工具栏(我使用了基于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 的背后,您将再次用高彩色图像替换结果),我发现它(有时候?)无法编辑工具栏。非常奇怪。
在这种情况下,我建议直接编辑 .rc 文件。
m_wndInvisibleToolBar.SetMaskMode( true );
,否则它将显示为无法编辑的工具栏,出现在您的“工具/自定义”命令(例如,您的CMFCToolBarsCustomizeDialog对象)中。 - johnwbyrdCMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
UINT uiBmpResID=0,
UINT uiColdResID=0,
UINT uiMenuResID=0,
UINT uiDisabledResID=0,
UINT uiMenuDisabledResID=0);
所以例如:
CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);
对我非常有效。
我相信(但我可能是错的)这些类与微软在收购BCG时包含在MFC中的BCGToolbar类相同。如果是这样,您可以创建一个工具栏,并在工具栏按钮上使用与要创建图标的菜单项相同的ID,它们应该会自动显示。当然,您不必实际显示工具栏。