//---
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());
}
//---
//---