需求:對話框中放置多個工具欄,並排顯示在同一行。
CRebarCtrl 是專為容納多個帶狀控件 (工具欄、地址欄、搜索框) 設計的容器,支援拖拽排序、換行、自動佈局。
CRebarCtrl (或代碼動態創建)。CToolBarCtrl 或 CToolBar。CRebarCtrl::AddBand 將每個工具欄作為一個 Band 添加。// MyDialog.h
class CMyDialog : public CDialogEx {
CRebarCtrl m_rebar;
CToolBarCtrl m_toolBar1, m_toolBar2;
// ...
};
// MyDialog.cpp
BOOL CMyDialog::OnInitDialog() {
CDialogEx::OnInitDialog();
// 1. 創建 ReBar
m_rebar.Create(this, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | RBS_BANDBORDERS, 0);
// 2. 創建工具欄 1
m_toolBar1.Create(this, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_NODIVIDER);
m_toolBar1.LoadToolBar(IDR_TOOLBAR1); // 資源 ID
m_toolBar1.SetWindowText(_T("工具欄 1"));
// 3. 創建工具欄 2
m_toolBar2.Create(this, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_NODIVIDER);
m_toolBar2.LoadToolBar(IDR_TOOLBAR2);
m_toolBar2.SetWindowText(_T("工具欄 2"));
// 4. 添加到 ReBar (同一行)
REBARBANDINFO rbi = { sizeof(REBARBANDINFO) };
rbi.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_TEXT;
rbi.fStyle = RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP;
rbi.hwndChild = m_toolBar1.m_hWnd;
rbi.cxMinChild = 200; // 最小寬度
rbi.cyMinChild = 26; // 高度
rbi.lpText = _T("工具欄 1");
m_rebar.AddBand(&rbi);
rbi.hwndChild = m_toolBar2.m_hWnd;
rbi.lpText = _T("工具欄 2");
m_rebar.AddBand(&rbi);
// 5. 佈局 ReBar 位置大小 (可在 OnSize 中動態調整)
CRect rc;
GetClientRect(&rc);
m_rebar.MoveWindow(0, 0, rc.Width(), 60); // 高度容納兩行或單行
return TRUE;
}
RBS_VARHEIGHT:允許 Band 高度不同。RBBS_GRIPPERALWAYS:顯示拖動手柄,用戶可拖拽調整順序/換行。RBBS_FIXEDBMP:固定位圖背景。OnSize 中計算多個 CToolBar 的位置並排 MoveWindow,但無拖拽體驗。使用 CRebarCtrl 是 MFC 實現多工具欄單行並排、可拖拽的標準最佳實踐。