天天看點

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);//主要是這裡
           

以後三個步驟後,就可以去看效果啦