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

CToolBarEx 封裝類:簡化 MFC 工具列操作,幾行代碼建立專業工具列

     編輯:VC 教學

MFC 原生 CToolBar 操作繁瑣:建立、載入位圖、設定按鈕資訊、尺寸調整... 步驟多、易出錯。本文提供一個輕量級封裝類 CToolBarEx,將常用操作封裝為直觀的成員函數,讓工具列建立變得像積木一樣簡單。

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

// MainFrm.h
CToolBarEx m_tbex;

// MainFrm.cpp OnCreate
m_tbex.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_tbex.SetButtonNumber(5); // 含分隔條共 5 個位置

// 加入圖示 (支援 HICON 直接加入,自動建立圖像列表)
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME)); // 索引 0
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDR_TBTYPE));    // 索引 1
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_SWIRE));     // 索引 2
m_tbex.AddIcon(AfxGetApp()->LoadIcon(IDI_ICON1));     // 索引 3

// 設定按鈕:位置、命令ID、圖示索引、文字
m_tbex.SetButton(0, ID_APP_ABOUT, 0, _T("員工"));
m_tbex.SetButton(1, ID_APP_EXIT, 1, _T("進料"));
m_tbex.AddSeparator(2); // 位置 2 為分隔條
m_tbex.SetButton(3, ID_APP_ABOUT, 2, _T("Swire"));
m_tbex.SetButton(4, ID_APP_ABOUT, 3, _T("Coca"));

// 一鍵套用預設尺寸 (或自訂 SetSize(50,40))
m_tbex.SetDefaultSize(); 

// 完成!漂亮工具列已顯示

類別定義 CToolBarEx : public CToolBar

class CToolBarEx : public CToolBar
{
public:
    CToolBarEx();
    virtual ~CToolBarEx();

    // 圖示/位圖管理
    void SetImageSize(int cx, int cy); // 設定單個圖示尺寸
    void AddBitmap(CBitmap* pbmImage, COLORREF crMask); // 加入位圖+遮罩色
    void AddBitmap(CBitmap* pbmImage, CBitmap* pbmMask); // 加入位圖+遮罩位圖
    void AddIcon(HICON hIcon); // 核心:直接加入 HICON (最常用)

    // 按鈕配置
    void SetButtonNumber(int nCount); // 設定總按鈕數 (含分隔條)
    void SetButton(int nIndex, int nID, int nImageIndex, LPCTSTR pszText); // 完整設定
    void SetButton(int nIndex, int nID, int nImageIndex); // 僅圖示無文字
    void AddSeparator(int nIndex); // 插入分隔條

    // 尺寸設定
    void SetSize(int cx = 50, int cy = 40); // 設定按鈕尺寸 (含邊框)
    void SetDefaultSize(); // 根據第一個按鈕實際大小自動計算

    // 內部圖像列表 (公開供進階操作)
    CImageList m_img;
    CSize m_sizeImage; // 單個圖示尺寸

protected:
    void SetImage(); // 內部:將 m_img 套用至 ToolBarCtrl
    DECLARE_MESSAGE_MAP()
};

核心實現邏輯

CToolBarEx::CToolBarEx() 
{ 
    m_sizeImage = CSize(20, 20); // 預設圖示 20x20
    m_img.Create(m_sizeImage.cx - 1, m_sizeImage.cy - 1, ILC_COLOR8 | ILC_MASK, 1, 1); 
}

void CToolBarEx::AddIcon(HICON hIcon)
{
    m_img.Add(hIcon); // CImageList::Add(HICON) 自動拆解圖示與遮罩
    SetImage(); // 即時同步至控制項
}

void CToolBarEx::SetButton(int nIndex, int nID, int nImage, LPCTSTR pszText)
{
    SetButtonInfo(nIndex, nID, TBSTYLE_BUTTON, nImage);
    if (pszText) SetButtonText(nIndex, pszText);
}

void CToolBarEx::SetDefaultSize()
{
    CRect rc; GetItemRect(0, &rc); // 取得第一個按鈕實際矩形
    SetSizes(rc.Size(), m_sizeImage); // 按鈕尺寸=實際大小, 圖示尺寸=預設
}

void CToolBarEx::SetImage() { GetToolBarCtrl().SetImageList(&m_img); }
// ... 其他函數實現類似,均為對 MFC 原生 API 的薄封裝 ...

設計優勢

  • 語意清晰: AddIcon, SetButton, AddSeparator 直觀對應操作意圖。
  • 隱藏複雜度: 圖像列表建立、遮罩處理、按鈕索引管理全內部處理。
  • 彈性擴展: 公開 m_img, m_sizeImage 供進階需求直接操作。
  • 相容性佳: 繼承 CToolBar,所有原生功能 (浮動、停靠、工具提示) 完全保留。

適用場景

快速原型開發、工具列配置頻繁變更的專案、團隊統一工具列建立規範。若需極致客製化 (如自繪、複雜佈局),仍建議直接操作原生 API。

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