当前位置: 代码迷 >> 综合 >> 孙鑫VC++深入详解:Lesson9 Part4---工具栏编程
  详细解决方案

孙鑫VC++深入详解:Lesson9 Part4---工具栏编程

热度:32   发布时间:2024-01-19 15:14:08.0

//---

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_MAINFRAMEDockControlBar(&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_TOOLBAR1DockControlBar(&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);//重构窗口layoutDockControlBar(&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 herepCmdUI->SetCheck(m_NewToolBar.IsWindowVisible());
}

//---

//---




  相关解决方案