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

//---

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

//---

//---




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值