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

CToolBar 擴充類別 CToolBarEx:簡化工具列操作的封裝實作

     編輯:關於VC++

MFC 原生 CToolBar 操作繁瑣(建立、設定按鈕、載入位圖、設定尺寸分散多處)。本文封裝常用功能為 CToolBarEx 繼承類別,提供鏈式呼叫風格 API,大幅簡化工具列建立流程。

使用範例:幾行程式碼建立完整工具列

// CMainFrame 成員
CToolBarEx tbex;

// OnCreate 中
tbex.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
tbex.SetButtonNumber(5);  // 含分隔器

tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_TBTYPE));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_SWIRE));
tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_ICON1));

tbex.SetButton(0, ID_APP_ABOUT, 0, "員工");
tbex.SetButton(1, ID_APP_EXIT, 1, "進料");
tbex.AddSeparator(2);
tbex.SetButton(3, ID_APP_ABOUT, 2, "Swire");
tbex.SetButton(4, ID_APP_ABOUT, 3, "Coca");

tbex.SetSize();  // 或 SetDefaultSize()

類別定義與核心方法

class CToolBarEx : public CToolBar {
public:
    CImageList img;      // 圖片清單
    CSize sizeImage;     // 圖片尺寸
    
    // 圖片管理
    void SetImageSize(int cx, int cy);
    void AddBitmap(CBitmap* pbmImage, COLORREF crMask);
    void AddBitmap(CBitmap* pbmImage, CBitmap* pbmMask);
    void AddIcon(HICON hIcon);  // 自動加入圖片清單並更新工具列
    
    // 按鈕設定
    void SetButtonNumber(int n);           // 設定按鈕總數(含分隔器)
    void SetButton(int nBtn, int nID, int nImg, LPCTSTR lpText);  // 含文字
    void SetButton(int nBtn, int nID, int nImg);                  // 無文字
    void AddSeparator(int nBtn);           // 指定位置加入分隔器
    
    // 尺寸設定
    void SetSize(int cx=50, int cy=40);    // 設定按鈕大小
    void SetDefaultSize();                 // 依現有按鈕自動計算
    
    // 內部更新
    void SetImage();  // 將 img 套用至工具列控制項
};

關鍵實作細節

CToolBarEx::CToolBarEx() {
    sizeImage.cx = sizeImage.cy = 20;  // 預設 20×20
    img.Create(sizeImage.cx-1, sizeImage.cy-1, ILC_COLOR8|ILC_MASK, 1, 1);
}

void CToolBarEx::AddIcon(HICON hIcon) {
    img.Add(hIcon);
    SetImage();  // 即時更新
}

void CToolBarEx::SetButton(int nButton, int nID, int nImage, LPCTSTR lpText) {
    SetButtonInfo(nButton, nID, TBSTYLE_BUTTON, nImage);
    SetButtonText(nButton, lpText);
}

void CToolBarEx::SetSize(int nWidth, int nHeight) {
    CSize cs(nWidth, nHeight);
    SetSizes(cs, sizeImage);  // CToolBar::SetSizes(按鈕大小, 圖片大小)
}

void CToolBarEx::SetDefaultSize() {
    CRect rect; GetItemRect(0, &rect);
    SetSizes(rect.Size(), sizeImage);
}

優缺點分析

優點缺點/限制
API 直覺、鏈式操作、程式碼集中圖片清單建立時機固定(建構子),動態改變圖片尺寸需重建
整合 AddIcon/SetButton/SetSize 常用流程僅封裝基礎功能,進階功能(如下拉按鈕、自繪)仍需直接操作底層
支援 HICON 直接加入,免轉位圖錯誤處理簡單,資源載入失敗無回傳值

擴充建議

  • 加入 LoadToolBarEx(UINT nIDResource) 一鍵從資源載入
  • 支援 CBitmap 直接加入(目前僅 HICON)
  • 加入按鈕狀態控制:EnableButton()、CheckButton()、HideButton()
  • 實作 GetButtonRect()、HitTest() 等常用查詢

總結

CToolBarEx 以約 80 行程式碼封裝了工具列 90% 的常用建立流程,適合快速原型開發與中小型專案。原始碼開放,建議依專案需求擴充為完整工具列管理類別。

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