一 一般地,工具栏是菜单栏中菜单命令的图标按钮形式。
二 工具栏删除 Delete键只是删除了图标,要删除某个工具栏按钮,只需要鼠标左键按下,拖出到工具栏以外即可。如果要添加分隔符,只需要按下该图标,然后向工具栏右边轻微拖动,再次运行就可以看到分隔栏。
三 MFC自带工具栏的创建过程:
MainFrame.h中定义了一个受保护的变量:protected CToolBar m_wndToolBar;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 }
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //设置自己的停靠方式
EnableDocking(CBRS_ALIGN_ANY); //CMainFrame的成员 表示接收哪一种停靠方式
DockControlBar(&m_wndToolBar); //实现主工具栏停靠在主框架上
四 参照MFC自带工具栏创建属于自己的工具栏
4.1 添加ToolBar资源
4.2 在CMainFrame中添加一个受保护的CToolBar类型的成员变量m_newToolBar
4.3 调用Create函数与主窗体相关联
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_newToolBar.LoadToolBar(IDR_NEWTOOLBAR)) { TRACE0("未能创建自定义的工具栏\n"); return -1; // 未能创建 }
m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);
//EnableDocking(CBRS_ALIGN_ANY); 由于这是在现有基础上新增的,无需再次调用
DockControlBar(&m_newToolBar); //让它停靠在主窗口上
至此创建出来的工具栏显示隐藏不正常,按钮不显示,显示一个空白工具框。
void CMainFrame::OnNewtoolbarbtn() { //if (m_newToolBar.IsWindowVisible()) //{ // m_newToolBar.ShowWindow(SW_HIDE); //} //else //{ // m_newToolBar.ShowWindow(SW_SHOW); //} //RecalcLayout(); //由于工具栏隐藏或显示 会影响到其他工具或窗口的布局,因此需要调用该函数,否则只隐藏了按钮,工具栏还在 ////当工具栏按钮处于浮动状态时,如果单击该按钮,按钮隐藏了,但是工具栏没有隐藏。 ////因此需要再次调用DockControlBar(&m_newToolBar); //DockControlBar(&m_newToolBar); ////浮动状态时,隐藏之后,再显示的时候,它会出现在顶部位置,而不是原来的位置 ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//一个函数代替上面多行代码,且能正常隐藏和显示 }
void CMainFrame::OnUpdateNewtoolbarbtn(CCmdUI *pCmdUI) //UPDATE_COMMAND_UI 类型的消息 { pCmdUI->SetCheck(m_newToolBar.IsWindowVisible()); //设置复选标记 }
原文:https://www.cnblogs.com/zhou8744/p/10625119.html