MFC 預設 DockControlBar 將工具列堆疊停靠。本文實作 DockControlBarLeftOf 方法,讓第二個工具列停靠在第一個工具列右側,實現並排佈局,模擬 Visual Studio 風格工具列排列。
void CMainFrame::DockControlBarLeftOf(CToolBar* Bar, CToolBar* LeftOf) {
CRect rect; DWORD dw; UINT n;
RecalcLayout(TRUE); // 確保浮動工具列尺寸正確
LeftOf->GetWindowRect(&rect);
rect.OffsetRect(1, 0); // 稍微偏移模擬拖曳位置
// 判斷 LeftOf 當前停靠邊緣
dw = LeftOf->GetBarStyle();
n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : 0;
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);
}
CToolBar m_wndToolBar1;
CToolBar m_wndToolBar2;m_wndToolBar1.CreateEx(...); m_wndToolBar1.LoadToolBar(IDR_MAINFRAME);
m_wndToolBar2.CreateEx(...); m_wndToolBar2.LoadToolBar(IDR_WINDOW);m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar1); // 第一個標準停靠
DockControlBarLeftOf(&m_wndToolBar2, &m_wndToolBar1); // 第二個停靠在右側.rc) 加入兩個工具列位圖資源:ToolBar1.bmp (IDR_MAINFRAME)、ToolBar2.bmp (IDR_WINDOW)RecalcLayout(TRUE):強制重新計算浮動工具列尺寸,確保 GetWindowRect 取得正確矩形OffsetRect(1,0):微小偏移模擬使用者拖曳到目標位置的動作DockControlBar(Bar, n, &rect):傳入矩形參數時,MFC 會在該矩形區域停靠工具列而非預設整列佔滿CBRS_ALIGN_* 樣式旗標對應 AFX_IDW_DOCKBAR_* 常數DockControlBarRightOf、Above、Below 完整方位支援DockControlBarLeftOf 以約 20 行程式碼破解 MFC 預設堆疊停靠限制,實現並排工具列佈局。核心在於利用 DockControlBar 的矩形參數模擬拖曳停靠行為。適合需求多工具列並排的專案直接採用擴充。