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

打造 IE 風格 24 位真彩工具列:冷/熱狀態圖像列表完整實現

     編輯:VC 教學

IE 的工具列按鈕在滑鼠經過時會亮起鮮豔的「熱狀態」圖示,這需要工具列同時擁有兩組圖像列表:Normal (冷態) 與 Hot (熱態)。本文教你在 MFC 中完整實現 24 位真彩雙狀態工具列,核心在於 TB_SETIMAGELIST 與 TB_SETHOTIMAGELIST 訊息。

效果預覽

圖一:擁有冷/熱雙狀態真彩圖示的工具列

實現步驟

1. 準備資源

  • 工具列資源:IDR_HOTBAR (按鈕 ID 對應命令)
  • 冷態位圖:IDB_TOOLBAR_COLD (一般狀態)
  • 熱態位圖:IDB_TOOLBAR_HOT (滑鼠經過狀態)
  • 建議尺寸:21x20 像素/按鈕,24 位真彩色 BMP

2. 主框架宣告工具列與圖像列表成員

// MainFrm.h
protected:
    CToolBar m_hotToolBar; // 使用 CToolBar 即可,無需特殊類別
    CImageList m_ilCold, m_ilHot; // 兩組圖像列表需持久化,不可為區域變數

3. OnCreate 中建立工具列並雙列表綁定

// 建立工具列
if (!m_hotToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, 
    WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_hotToolBar.LoadToolBar(IDR_HOTBAR)) return -1;

// --- 核心:建立並設定冷態圖像列表 ---
CBitmap bmp;
bmp.LoadBitmap(IDB_TOOLBAR_COLD);
m_ilCold.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1); // ILC_COLORDDB: 裝置相關色彩 (通常 24/32 位)
m_ilCold.Add(&bmp, RGB(255, 0, 255)); // 洋紅色作為透明遮罩色
m_hotToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ilCold.m_hImageList);
bmp.Detach(); m_ilCold.Detach(); // 釋放 MFC 包裝,所有權轉給工具列

// --- 核心:建立並設定熱態圖像列表 ---
bmp.LoadBitmap(IDB_TOOLBAR_HOT);
m_ilHot.Create(21, 20, ILC_COLORDDB | ILC_MASK, 13, 1);
m_ilHot.Add(&bmp, RGB(255, 0, 255));
m_hotToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)m_ilHot.m_hImageList);
bmp.Detach(); m_ilHot.Detach();

4. 添加按鈕命令處理 (範例為導航按鈕)

// 訊息映射
ON_COMMAND(ID_BACK, OnBack)
ON_COMMAND(ID_FORWARD, OnForward)
ON_COMMAND(ID_STOP, OnStop)
ON_COMMAND(ID_REFRESH, OnRefresh)
ON_COMMAND(ID_HOME, OnHome)

// 處理函數 (實際專案填入導航邏輯)
void CMainFrame::OnBack() {}
void CMainFrame::OnForward() {}
void CMainFrame::OnStop() {}
void CMainFrame::OnRefresh() {}
void CMainFrame::OnHome() {}

關鍵技術點

  • ILC_COLORDDB vs ILC_COLOR24: ILC_COLORDDB 會根據當前螢幕色深建立最佳色彩格式 (24/32 位),且相容 LR_LOADMAP3DCOLORS 類型載入;ILC_COLOR24 強制 24 位但可能在某些舊系統有相容性問題。
  • 透明遮罩色 RGB(255,0,255): 標準洋紅色,美工繪圖時將透明區填此色,CImageList::Add 會自動產生遮罩。
  • 成員變數持久化: CImageList 必須為類別成員,若為區域變數函數結束即解構,導致工具列圖像列表指標失效,顯示空白。
  • 熱態圖像列表同步: 兩組圖像列表按鈕順序、數量、尺寸必須完全一致,否則熱態切換會錯位。

這套方案無需第三方類別,純 MFC API 即可實現商業級真彩雙狀態工具列,穩定高效。

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