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

MFC 工具列顯示 256 色圖像:LoadImage + ILC_COLOR8 完整實作

     編輯:關於C語言

MFC 預設工具列位圖僅支援 16 色(4 位元),導致圖示色彩斑駁。本文示範如何利用 ::LoadImage 的 LR_LOADMAP3DCOLORS 與 LR_CREATEDIBSECTION 旗標,配合 CImageList::Create(..., ILC_COLOR8, ...) 實現工具列 256 色(8 位元調色盤)甚至真彩色顯示。

核心步驟

  1. 以 ::LoadImage 載入位圖資源,啟用 3D 面板色對映與 DIB 區段:
HBITMAP hbm = (HBITMAP)::LoadImage(
    AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_MAINFRAME),
    IMAGE_BITMAP, 0, 0,
    LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS
);
  • LR_LOADMAP3DCOLORS:將位圖中 RGB(192,192,192) (標準工具列灰色背景)自動對映為系統當前的 COLOR_3DFACE 系統色,解決不同主題下背景色不匹配問題。
  • LR_CREATEDIBSECTION:建立 DIB Section,使位圖像素資料可直接被應用程式存取,也是後續建立高色深影像清單的前提。
  1. 包裝為 CBitmap 並建立 256 色影像清單:
CBitmap bm;
bm.Attach(hbm); // 接管 HBITMAP 所有權

// 關鍵:ILC_COLOR8 = 8 位元調色盤 (256 色);若需 24/32 位真彩色請用 ILC_COLOR24/ILC_COLOR32
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4); // 圖示 20x20,初始 4 個,成長 4 個
m_ilToolBar.Add(&bm, (CBitmap*)NULL); // 無遮罩位圖,以品紅色(RGB 255,0,255)為透明色
  1. 將新影像清單指派給工具列控制項(此步驟最易遺漏):
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

完整 CMainFrame::OnCreate 範例

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

    // 1. 建立並載入工具列資源 (不直接 LoadToolBar,改手動控制)
    if (!m_wndToolBar.Create(this) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { // LoadToolBar 內部會建立預設 16 色清單
        return -1;
    }

    // 2. 以高色深重新載入位圖
    HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
        MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_BITMAP, 0, 0,
        LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
    if (!hbm) return -1;

    CBitmap bm; bm.Attach(hbm);

    // 3. 重建影像清單 (256 色)
    m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4);
    m_ilToolBar.Add(&bm, NULL);

    // 4. 替換工具列控制項的影像清單
    m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

    // ... 狀態列、檢視視窗建立 ...
    return 0;
}

進階:真彩色 (24/32 位) 工具列

若專案需求極高色彩保真度(如圖示含漸層、陰影),可改用 ILC_COLOR24 或 ILC_COLOR32,但 LR_LOADMAP3DCOLORS **僅支援調色盤位圖**,真彩色模式下需自行處理背景色透明化(通常在美術資源階段預先去背,或程式碼中 ImageList_AddMasked 指定透明色)。

同場加映:ListView / ReBar 同樣適用

此技術核心在於 CImageList 的建立參數,故同樣適用於 CListCtrl、CTreeCtrl、CReBarCtrl 等所有使用影像清單的控制項。

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