首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 對話框多工具欄單行顯示:使用 CRebarCtrl 容器

     編輯:程式設計綜合問答

需求:對話框中放置多個工具欄,並排顯示在同一行。

解決方案:CRebarCtrl (條狀控件)

CRebarCtrl 是專為容納多個帶狀控件 (工具欄、地址欄、搜索框) 設計的容器,支援拖拽排序、換行、自動佈局。

實現步驟

  1. 對話框資源編輯器放置一個 CRebarCtrl (或代碼動態創建)。
  2. 創建多個 CToolBarCtrl 或 CToolBar。
  3. 調用 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,但無拖拽體驗。
  • CMFCToolBar + CMFCRibbonBar (MFC Feature Pack):現代 Office 風格,功能更豐富但複雜度高。

使用 CRebarCtrl 是 MFC 實現多工具欄單行並排、可拖拽的標準最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved