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

VC++ 實現工具列顯示透明 256 色以上圖示:CImageList + ILC_COLOR8 + LoadImage 完整方案

     編輯:關於VC++

問題背景

MFC 預設工具列僅支援 16 色圖示。若直接載入 256 色/真彩色圖示會出現色彩失真 (調色板映射錯誤)。常見替代方案是製作 256 色工具列位圖條,但繪圖工具支援有限。本文提供直接使用獨立 .ico 檔/資源圖示,透過 CImageList 正確建立 256 色透明圖示列表的方案。

核心原理


// 關鍵:Create 參數 bMask = TRUE | ILC_COLOR8
m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
// TRUE       → 使用遮罩 (透明)
// ILC_COLOR8 → 8位元調色板 (256 色)
// 兩者「位元或」→ 256 色透明圖示列表

完整實現步驟

  1. 資源編輯器 → 圖示 → 右鍵 Insert Device Image → Custom → 32×32、256 色 (或 True Color)
  2. 主框架類別加入成員:CImageList m_ilTB;
  3. OnCreate 中建立並關聯:
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCS) {
        if (CFrameWnd::OnCreate(lpCS) == -1) return -1;
    
        // 建立工具列 (扁平風格)
        if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|
            CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) ||
            !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
            TRACE0("Failed to create toolbar\n"); return -1;
        }
    
        // 建立 256 色透明圖示列表
        m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
    
        HICON hIcon;
        hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);
        m_ilTB.Add(hIcon);
        hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 32, 32, 0);
        m_ilTB.Add(hIcon);
        hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON3), IMAGE_ICON, 32, 32, 0);
        m_ilTB.Add(hIcon);
        hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON4), IMAGE_ICON, 32, 32, 0);
        m_ilTB.Add(hIcon);
    
        // 關聯到工具列控制項
        m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB);
    
        // 停靠設定
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndToolBar);
        return 0;
    }
        

關鍵 API 解析

函式關鍵參數說明
CImageList::Createcx, cy, TRUE|ILC_COLOR8, nInitial, nGrow建立 256 色帶遮罩圖示列表
LoadImagehinst, MAKEINTRESOURCE(ID), IMAGE_ICON, 32, 32, 0從資源載入指定尺寸圖示
CImageList::Add(HICON)hIcon將圖示加入列表 (內部複製像素與遮罩)
CToolBarCtrl::SetImageList&m_ilTB替換工具列預設圖示列表

為什麼不直接用工具列位圖條?

  • 獨立 .ico 檔/資源圖示:單檔管理、設計師友善、支援透明度、可跨專案複用
  • 位圖條:需精確對齊、調色板固定、修改單一圖示需重編整條

進階:真彩色 (32-bit Alpha) 圖示

VC6.0 CImageList 不直接支援 ILC_COLOR32。若需 Alpha 通道:

  • 升級至 VS2008+ (MFC 9.0+ 完整支援 ILC_COLOR32)
  • 或使用 CImageList + GDI+ 手動合成 (較複雜)

總結

CImageList::Create(cx, cy, TRUE | ILC_COLOR8, ...) 是在 VC6.0/MFC 實現 256 色透明工具列圖示的標準且最簡潔做法。配合 LoadImage 載入獨立圖示資源,兼顧開發效率與視覺品質。

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