//---
1. 工具栏类CToolBar是CControlBar的子类,而CControlBar是CWnd的子类...因此工具栏是个窗口.
1.将工具栏的图标的ID与子菜单项的ID设置成一样的,这样工具栏图标就可以响应子菜单项的消息.
2. 怎么将子菜单项目带有勾标记,即设置取消复选标记(勾):方法是添加UPDATED_COMMAND_UI消息即可.
//----
创建工具栏的过程:
1).定义一个工具栏对象. CToolBar m_NewToolBar; // 自定义工具栏 对象
2). 模仿CMainFrame::OnCreate中的写法 ,调用Create,EnableDocking(),DockControlBar()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //------关联工具栏对象m_wndToolBar与资源IDR_MAINFRAME--- 即创建工具栏,工具栏就是一个窗口,其由CWnd...派生 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("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable //CControlBar::EnableDocking,这里是指明工具栏IDR_MAINFRAME是否可以停泊在父窗口上,以及如何停泊 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); // 这是调用的CFrameWnd::EnableDocking,指明主框架窗口可以停泊工具栏,不具体指定哪个工具栏.这样其他任何新建的工具栏也可以停泊了. EnableDocking(CBRS_ALIGN_ANY); //停泊工具栏具体的工具栏: 由对象m_wndToolBar关联的工具栏IDR_MAINFRAME DockControlBar(&m_wndToolBar); //------自定义工具栏的实现 //------关联工具栏对象m_NewToolBar与资源IDR_TOOLBAR1--- 改在右边CBRS_RIGHT if (!m_NewToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_NewToolBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } //CControlBar::EnableDocking,这里是指明工具栏m_NewToolBar是否可以停泊在父窗口上,以及如何停泊 m_NewToolBar.EnableDocking(CBRS_ALIGN_ANY); //停泊工具栏具体的工具栏: 由对象m_newToolBar关联的工具栏IDR_TOOLBAR1 DockControlBar(&m_NewToolBar); //------先加载图标到数字m_hIcon[], 用SetClassLong()调用,修改标题图标,放置一个定时器 m_hIcon[0] =LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); extern CStyleApp theApp; // 要用theApp这个全局的应用程序对象,需要申明下它是CStyleApp中定义过的. m_hIcon[1] =LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); m_hIcon[2] =LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); SetClassLong(this->m_hWnd,GCL_HICON,(LONG)m_hIcon[0]);//把m_hIcon[0]设置为窗口创建后的默认图标 SetTimer(1,1000,NULL); //设置一个定时器,定时产生WM_TIMER消息 return 0; }
//----方式1: 调用ShowWindow,RecalcLayout,DockControlBar
这里有问题,就是工具栏隐藏后,再显示,怎么在原来的位置显示?
保存原来显示时工具栏窗口的位置......
//----方式2: 调用ShowControlBar 是CFrameWnd::ShowControlBar 框架类的函数
void CMainFrame::OnViewNewtoolbar() { // TODO: Add your command handler code here //----方式1: 调用ShowWindow,RecalcLayout,DockControlBar /* static CRect rect; //保存工具栏的位置 if(m_NewToolBar.IsWindowVisible()) { //m_NewToolBar.GetWindowRect(&rect); m_NewToolBar.ShowWindow(SW_HIDE); } else { m_NewToolBar.ShowWindow(SW_SHOW); //m_NewToolBar.MoveWindow(rect); } RecalcLayout(true);//重构窗口layout DockControlBar(&m_NewToolBar); */ //----方式2: 调用ShowControlBar 是CFrameWnd::ShowControlBar 框架类的函数 ShowControlBar(&m_NewToolBar,!m_NewToolBar.IsWindowVisible(),FALSE); } // 给子菜单"新工具栏"增加 勾选复选设置 void CMainFrame::OnUpdateViewNewtoolbar(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_NewToolBar.IsWindowVisible()); }