如果你的应用程序添加了几个工具栏,你将需要一个控制他们初始停靠位置的方法,重复调用CFrameWnd::DockControlBar()并不是办法,因为标准的MFC布置算法将把每个工具栏放置在不同的停靠区,你可能更希望把这些工具栏停靠在同一停靠区,那么就需要借助下面的函数:
void EkDockBarNextTo(CControlBar* pNewBar,CControlBar* pDockedBar,UINT nDockBarID=AFX_IDW_DOCKBAR_TOP)
{
ASSERT_VALID( pDockedBar );
ASSERT_VALID( pNewBar );
// 1 - 找到将要停靠的框架
CFrameWnd* pFrame = pDockedBar->GetDockingFrame();
// 2 - 强制MFC计算停靠工具条的位置
pFrame->RecalcLayout();
// 3 - 计算已经停靠的工具条的CRect
CRect rect;
pDockedBar->GetWindowRect( &rect );
// 4 -轻微的将该矩形偏移到右下,从而使新的条停靠在已存在的条的右部或底部
rect.OffsetRect(1,1);
// 5 - 将新的工具条停靠在指定的位置
pFrame->DockControlBar( pNewBar, nDockBarID, &rect );
}
下面的代码说明了如何使用这个函数:
//新工具栏停靠
m_wndNewToolbar.EnableDocking( CBRS_ALIGN_ANY );
EkDockBarNextTo(&m_wndNewToolbar,&m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
CFrameWnd::RecalcLayout
virtual void RecalcLayout(BOOL bNotify = TRUE);
参数:
bNotify | 决定活动的项目 是否接收 布局改变通知。如果为TRUE,则此项被通知,否则不通知。 |
说明:
当标准控制条正在开/关 或 框架窗口重新设置大小时,由框架调用。此成员函数的缺省实现是调用CWnd的成员函数RepositionBars在 框架 和 主客户窗口中 重新定位各种控件条,主客户窗口 通常是CView或MDICLIENT。
覆盖此函数,在框架窗口设计 改变时 控制外观形式和动作。例如 在使 控件条开或闭或加入另一个控件条时调用它。