工具栏的显示和隐藏

一直想不到合适的方法来解决孙鑫老师在第九课提出的问题:当工具栏在客户呈现浮动状态时,再次点击“新工具栏”按钮,会使工具栏重新放置在“工具栏”的下方。提示在CToolBar类或者它的父类中找到一些函数来解决该问题。查看MSDN发现CToolBar的父类为CControlBar,其中有两个成员函数FloatControlBar()和IsFloating()。只有你调用了FloatControlBar()后,IsFloating()才会返回TRUE,也就是说当你手动把“新工具栏”拖动到客户区时,虽然是呈现浮动状态,但是该函数的返回值仍然是FALSE。

后来自己想了一个方法:当“新工具栏”按钮添加成功后,在CMainFrame的OnCreate()中计算出“新工具栏”按钮与父窗口的间距dx和dy,再在OnNewtoolBar()函数中计算按钮与父窗口的间距DX和DY。根据DX与dx,DY与dy之间的比较,就可以判断“新工具栏”按钮是否移动了,移动到哪了?

环境:VS2008

步骤:1.资源视图的toolbar中添加一个工具栏,添加一些你想要的工具栏按钮,并在Menu中的视图下面添加一个“新      工具栏”按钮,ID为IDM_NEWTOOLBAR。

          2.在CMainFrame中添加一个成员变量m_ToolBar,类型为CToolBar;

          3.在OnCreate()函数中参照“工具栏”按钮的方法,添加“新工具栏按钮”;添加成员变量dx和dy,类型为int;添加成员变量rect_window和rect_toolbar,类型为CRect

	if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
	{
		TRACE0("未能创建工具栏\n");
		return -1;      // 未能创建
	}
	
	m_ToolBar.EnableDocking(CBRS_ALIGN_TOP);
	DockControlBar(&m_ToolBar);

	GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);//设置复选标记
	
	//获得初始化时“新工具栏”与父窗口的间距
	m_ToolBar.GetWindowRect(&rect_toolbar);
	GetWindowRect(&rect_window);
	dx=rect_toolbar.left-rect_window.left;
	dy=rect_toolbar.top-rect_window.top+24;
4.为“新工具栏”按钮添加消息响应函数OnNewtoolBar(),编辑代码

void CMainFrame::OnNewtoolbar()
{
	// TODO: 在此添加命令处理程序代码
	if(m_ToolBar.IsWindowVisible())
	{

		GetWindowRect(&rect_window);
		
		m_ToolBar.GetWindowRect(&rect_toolbar);
		
		m_ToolBar.ShowWindow(SW_HIDE);
		DockControlBar(&m_ToolBar);
		
		GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_UNCHECKED);
	}
	else
	{
		int DX=rect_toolbar.left-rect_window.left;
		int DY=rect_toolbar.top-rect_window.top;
	
		if(((DX>dx)&&(DY>dy))||(rect_toolbar.left-2<rect_window.left)||
			(rect_toolbar.left>rect_window.right)||(rect_toolbar.bottom<rect_window.top))
		{
			CPoint point(rect_toolbar.left,rect_toolbar.top);
			m_ToolBar.ShowWindow(SW_SHOW);
			FloatControlBar(&m_ToolBar,point);
		}
		else 
		{
			ScreenToClient(rect_toolbar);
			m_ToolBar.MoveWindow(rect_toolbar);
			m_ToolBar.ShowWindow(SW_SHOW);
		}
		GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);
	}
	RecalcLayout(TRUE);
	//ShowControlBar(&m_ToolBar,!m_ToolBar.IsWindowVisible(),FALSE);

}

当(DX>dx)&&(DY>dy)时,表明“新工具栏”按钮是朝着右下方的位置移动,当rect_toolbar.left-2<rect_window.left,表面浮动的工具栏移出了父窗口,且在父窗口的左边,其他的类似。

剩下的情况表明窗口没有拖动成浮动状态,应该继续让其停留在该停留的位置。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值