1. CMFCToolBar::LoadToolBarEx 配合CMFCToolBarInfo 可以指定工具条的大图标,需要设置CMFCToolBarInfo::m_uiLargeHotResID资源ID
CMFCToolBarInfo tbInfo;
tbInfo.m_uiHotResID = IDR_TOOLBAR_STANDARD; // Toolbar "hot" images
tbInfo.m_uiLargeHotResID = IDB_TOOLBAR_STANDARD_LARGER; // Toolbar large "hot" images
if (!m_wndToolbarStandard.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1,1,1,1), IDR_TOOLBAR_STANDARD) ||
!m_wndToolbarStandard.LoadToolBarEx(IDR_TOOLBAR_STANDARD, tbInfo))
{
TRACE0("Failed to create standard toolbar\n");
return false; // fail to create
}
m_wndToolbarStandard.SetWindowText(_T("标准"));
m_wndToolbarStandard.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, _T("自定义..."));
m_wndToolbarStandard.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndToolbarStandard);
2. CMFCToolBar::AddToolBarForImageCollection 为仅在菜单里显示的命令指定图标。
// Load menu item image (not placed on any standard toolbars):
CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAR_OTHER, IDR_TOOLBAR_OTHER);
3. CMFCToolBar::EnableCustomizeButton 可以指定工具条自定义的响应消息处理,即启用工具栏最右侧的小箭头。
4. CFrameWndEx::EnablePaneMenu 启用在工具栏上的右键自定义工具条菜单,即在工具栏空白处的右键菜单。
// 启用工具栏和停靠窗口菜单替换
EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);
5. CMDIFrameWndEx::DockPaneLeftOf 实现多工具条在一行的效果。
注意:
如果存在多个工具条,则在创建工具条时(CMFCToolBar::CreateEx)一定要指定ID,否则会导致以上第3第4条的功能紊乱,这个坑我踩了,跟代码查资料最后才解决。这里要感谢http://blog.sina.com.cn/s/blog_6167e9fc0100wso5.html的文章。
ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
这两个消息记着实现,否则工具条的右键菜单自定义是不能用的,这两个消息的实现,可参照VS创建的带CFMCToolbar的工程,创建初期已经实现。