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

VC++ 顯示透明 256 色以上圖標:CImageList 實戰技巧

     編輯:VC 教學

問題背景

早期 VC++ 工具欄僅支持 16 色圖標,高色彩圖標加載後失真。雖可用高色彩位圖替代,但繪圖工具支持有限。本文介紹利用 CImageList + CToolBarCtrl 直接加載透明高色彩圖標的方法。

核心原理

CImageList::Create 關鍵參數


BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow);
  • cx, cy:圖標寬高(如 32×32)
  • nFlags:ILC_COLOR8 | ILC_MASK(或 TRUE | ILC_COLOR8)
    → ILC_COLOR8:256 色調色板
    → ILC_MASK/TRUE:啟用掩模(透明)
  • nInitial:初始圖標數
  • nGrow:擴容步長

實現步驟

  1. 創建單文檔項目 TB
  2. 主框架類 CMainFrame 添加成員:CImageList m_ilTB;
  3. 資源編輯器添加 256 色圖標(32×32,自定義設備圖像)
  4. OnCreate 中初始化並關聯工具欄

完整代碼實現


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -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;
    }

    // === 核心:創建高色彩透明圖像列表 ===
    m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0); // 透明 + 256色

    HICON hIcon = NULL;
    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;
}

關鍵函數解析

函數作用關鍵參數
LoadImage加載圖標/位圖/光標資源IMAGE_ICON、期望尺寸、LR_DEFAULTCOLOR(0)
MAKEINTRESOURCE資源 ID 轉字符串指針配合 LoadImage 使用
CImageList::Add添加圖標到列表接收 HICON,自動複製
CToolBarCtrl::SetImageList設置工具欄圖像列表替換默認低色彩列表

進階補充

  • 更高色深:使用 ILC_COLOR24 或 ILC_COLOR32(需 Win98+/IE3+)支持真彩色+Alpha通道
  • 掩模操作:CImageList::GetImageInfo 獲取位圖與掩模,可實現複雜透明效果
  • 圖標大小:系統小圖標 16×16,大圖標 32×32,XP+ 支持 48×48
  • 資源管理:LoadImage 返回的 HICON 需 DestroyIcon 釋放,但 CImageList::Add 內部已複製,原句柄可立即銷毀

總結

靈活運用 CImageList::Create 的標志組合(ILC_COLOR8 | ILC_MASK),配合 LoadImage 精確控制加載尺寸,即可在工具欄完美顯示透明高色彩圖標。此法避免了制作大位圖的麻煩,直接復用現有圖標資源,是 MFC 界面美化的實用技巧。

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