一、標準工具條停靠位置的控制
VC5 應用程序嚮導生成的框架代碼中,都具有普通工具條的控制方法。正常情況下工具條類CToolBar是控制條類CControlBar 的派生類,其顯示的初始停靠位置是通過調用繼承的函數CControlBar::EnableDocking(DWORD dwStyle)來確定的,其參數dwStyle用來指定停靠具體位置,與本文有關的風格如下(其餘請參閱VC5的聯機文檔):
CBRS_ALIGN_TOP 停靠在框架窗口客戶區域頂部
CBRS_ALIGN_BOTTOM 停靠在框架窗口客戶區域底部
CBRS_ALIGN_LEFT 停靠在框架窗口客戶區域左邊
CBRS_ALIGN_RIGHT 停靠在框架窗口客戶區域右邊
CBRS_ALIGN_ANY 停靠在框架窗口客戶區域任何位置
在利用應用程序嚮導AppWizard 生成的應用程序中,其控制代碼默認的停靠位置控制風格爲CBRS_ALIGN_ANY,即允許停靠在框架窗口客戶區域的任何邊上。工具條在正常顯示時爲停靠在窗口客戶區域的頂部,控制指令爲EnableDocking(CBRS_ALIGN_ANY)或m_wndToolBar。EnableDocking(CBRS_ALIGN_ANY) ,注意,在實際程序控制時前者必須處於所有其它控制代碼的前面,否則浮動工具條或特殊工具條等部分代碼可能無法奏效。具體控制方法請參考利用應用程序嚮導生成的任何一個程序實例的框架代碼部分中的建立函數ONCREATE()。
應用程序的單文檔和多文檔的窗口框架類均爲CFrameWnd 的派生類,其指定工具條的停靠位置均是通過調用繼承的函數 CFrameWnd::EnableDocking(DWORD dwDockStyle)來實現的,其可選的參數除上述五種之外,還增加了CBRS_FLOAT_MULTI參數,這個參數主要是爲設計浮動工具條而增加的,其用來確定一個框架窗口中允許存在多個浮動工具條。同樣,利用應用程序嚮導AppWizard 生成的應用程序,其默認的停靠位置也是CBRS_ALIGN_ANY,即允許工具條停靠在框架窗口的任何邊上,其默認的初始位置爲框架窗口的頂部,即爲EnableDocking(CBRS_ALIGN_ANY)或m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY)。
二、浮動工具條停靠位置的控制
如果在一個框架窗口中存在多個標準或浮動工具條時,需要利用函數void DockControlBar(CControlBar *pBar,UINT nDockBarID=0,LPCRECT lpRect= NULL)來確定要控制停靠位置的工具條,它也是CFrameWnd類的成員函數,其中參數pBar用來指向被控制停靠位置的工具條對象指針,參數nDockBarID用來確定工具條停靠在框架窗口的哪條邊上,其控制風格的具體取值爲:
AFX_IDW_DOCKBAR_TOP 停靠在框架窗口的頂部
AFX_IDW_DOCKBAR_BOTTOM 停靠在框架窗口的底部
AFX_IDW_DOCKBAR_LEFT 停靠在框架窗口的左邊
AFX_IDW_DOCKBAR_RIGHT 停靠在框架窗口的右邊
當參數nDockBarID的取值爲0時,則工具條可以停靠在框架窗口中的任何一個可停靠的邊上,其默認的初始位置爲窗口頂部。
三、並列工具條停靠位置的控制
很多大型應用程序中都存在這樣的工具條,將多個工具條同時並列停靠在某窗口的某一條邊上。對於這種停靠方法,利用上述工具條控制函數DockControlBar的lpRect參數,通過控制工具條的停靠矩形區域的方法可以實現。如筆者實現的函數如下:
(一)在實現文件MainFrm.h中增加如下成員函數定義
void DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf);
(二)在實現文件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()函數的調用,前一個函數用來重新顯示被調整的客戶區和工具條,後一個函數用來重新確定矩形區域,這相當於利用鼠標將第二個工具條窗口拖動到前一個工具條上然後釋放。
(三)修改應用程序建立函數OnCreate()中的相應DockControlBar()函數爲DoctControlBarOf()函數,並正確設置工具條對象的指針,如筆者實現程序中的控制代碼如下:
EnableDocking(CBRS_ALIGN_ANY);//停靠位置必須在最前面
......//工具條建立函數
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndTestToolBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
//使兩個工具條並列停靠
DockControlBarLeftOf(&m_wndTestToolBar,&m_wndToolBar);
四、工具條頂部停靠位置的控制
工具條的最後一種停靠位置控制方法是,如何控制定製工具條的停靠位置,如具有通用控制功能工具條的停靠位置等。這主要實現左右兩側定製工具條與頂部工具條之間誰靠近框架窗口邊的位置關係。如筆者實現程序中的控制步驟如下:
(一)打開菜單資源增加頂部位置控制菜單項IDD_DLGBARTOP;
(二)在實現文件MainFrm.h中增加成員控制變量m_bDialogTop;
BOOL m_bDialogTop;
並在構造函數中爲其設置初始值;
(三)利用類嚮導ClassWizard爲菜單項設置響應函數;
(四)在實現文件MainFrm.cpp中通過充分利用SetWindowPos( )成員完善消息映射功能。
void CMainFrame::OnButtonDlgbartop()
{ //定製工具條頂部位置控制函數
if (m_bDialogTop) m_wndDlgBar.SetWindowPos(
&m_wndStatusBar,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//頂部工具條停靠在窗口邊,左右工具條停靠其下
else m_wndDlgBar.SetWindowPos(&wndTop,0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE);//停靠在最頂部
RecalcLayout(); //重新顯示窗口
m_bDialogTop=!m_bDialogTop;//改變變量標誌
}
void CMainFrame::OnUpdateButtonDlgbartop(CCmdUI* pCmdUI)
{ //設置菜單項檢查狀態更新函數
pCmdUI->SetCheck(m_bDialogTop);
}
這樣,就可以利用菜單項來控制定製工具條的頂部停靠位置。