首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

自訂浮動工具列佈局:DockControlBarLeftOf 實現工具列並排停靠

     編輯:關於VC++

MFC 預設 DockControlBar 將工具列堆疊停靠。本文實作 DockControlBarLeftOf 方法,讓第二個工具列停靠在第一個工具列右側,實現並排佈局,模擬 Visual Studio 風格工具列排列。

核心方法:DockControlBarLeftOf

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);
}

完整整合步驟

  1. 建立 MDI 專案(單文檔亦可)
  2. MainFrm.h 宣告兩個工具列成員:
    CToolBar m_wndToolBar1;
    CToolBar m_wndToolBar2;
  3. OnCreate 建立雙工具列:
    m_wndToolBar1.CreateEx(...); m_wndToolBar1.LoadToolBar(IDR_MAINFRAME);
    m_wndToolBar2.CreateEx(...); m_wndToolBar2.LoadToolBar(IDR_WINDOW);
  4. 啟用停靠並套用並排佈局:
    m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    
    DockControlBar(&m_wndToolBar1);           // 第一個標準停靠
    DockControlBarLeftOf(&m_wndToolBar2, &m_wndToolBar1);  // 第二個停靠在右側
  5. 資源檔 (.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 的矩形參數模擬拖曳停靠行為。適合需求多工具列並排的專案直接採用擴充。

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