天天看点

MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上

这是新工作的第四天,按上级的要求开发一个便民小程序,就要用到标题中说的,这下可难到我啦,查了MSDN并没有发现类似把某个toolbar放在另一个的右边的函数,所以自己百度了一下,还好发现高人指出一条明路,我试了一下高人提供的方法,可行,特此共享出来。

源码作者说:很多大型应用程序中都存在这样的工具条,将多个工具条同时并列停靠在某窗口的某一条边上。对于这种停靠方法,利用上述工具条控制函数DockControlBar的lpRect参数,通过控制工具条的停靠矩形区域的方法可以实现

1:在MainFrm.h中增加如下成员函数定义

// 增加
public:
	void DockControlBarLeftOf(CToolBar* bar, CToolBar* leftof);
           

2:在MainFrm.cpp中实现成员函数

void CMainFrame::DockControlBarLeftOf(CToolBar* bar, CToolBar* leftof)
{
	//设置工具条并列停靠到同一条边上
	CRect rect;
	DWORD dw;
	UINT n=0;
	RecalcLayout();	//重新显示
	leftof->GetWindowRect(rect);
	rect.OffsetRect(1, 0);
	dw=leftof->GetBarStyle();
	n=(dw&CBRS_ALIGN_TOP)?AFX_IDW_DOCKBAR_TOP:n;
	n=(dw&CBRS_ALIGN_BOTTOM&&n==0)?AFX_IDW_DOCKBAR_BOTTOM:n;
	n=(dw&CBRS_ALIGN_LEFT&&n==0)?AFX_IDW_DOCKBAR_LEFT:n;
	n=(dw&CBRS_ALIGN_RIGHT&&n==0)?AFX_IDW_DOCKBAR_RIGHT:n;
	DockControlBar(bar,n,&rect);
}
           

在这个函数中应注意对RecalcLayout()函数和OffsetRect()函数的调用,前一个函数用来重新显示被调整的客户区和工具条,后一个函数用来重新确定矩形区域,这相当于利用鼠标将第二个工具条窗口拖动到前一个工具条上然后释放。

3:就是调用上面这个函数,假设你新建的toolbar变量是m_wndToolBarNav,那么就用下面的程序替换原来MainFrm.cpp中的片段

原:

// TODO: 如果不需要可停靠工具栏,则删除这三行
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
           

替换后:

// TODO: 如果不需要可停靠工具栏,则删除这三行
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBarNav.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	DockControlBarLeftOf(&m_wndToolBarNav,&m_wndToolBar);//主要是这里
           

以后三个步骤后,就可以去看效果啦