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

MFC 工具列顯示 256 色圖像完整解決方案:突破 16 色限制

     編輯:關於VC++

MFC 預設工具列與列表視圖的圖像清單(Image List)僅支援 16 色,導致開發者無法直接使用資源中建立的 256 色圖示或位圖。本文詳細說明如何透過 LoadImage 與 ILC_COLOR8 旗標,輕鬆實現工具列的 256 色真彩顯示,同樣技巧亦適用於 Rebar、列表視圖等使用圖像清單的控件。

問題根源

工具列按鈕圖像儲存於圖像清單,本質是一張長條位圖(如 7 個 20×20 圖示組成 140×20 位圖)。MFC 內部載入工具列位圖時呼叫 AfxLoadSysColorBitmap,預設僅建立 16 色裝置相關位圖(DDB),且建立圖像清單時預設色深為 16 色(ILC_COLOR4)。

核心解決步驟

在 CMainFrame::OnCreate 中替換預設載入流程:

// 1. 使用 LoadImage 載入位圖,啟用 3D 色彩映射與 DIB 建立
HBITMAP hbm = (HBITMAP)::LoadImage(
    AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_MAINFRAME),
    IMAGE_BITMAP, 0, 0,
    LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS
);
CBitmap bm; bm.Attach(hbm);

// 2. 建立 256 色圖像清單(ILC_COLOR8 = 8-bit 調色盤,即 256 色)
m_ilToolBar.Create(20, 20, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm, (CBitmap*)NULL);

// 3. 將新圖像清單套用至工具列控件
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

關鍵細節解析

  • LR_CREATEDIBSECTION:建立裝置獨立位圖(DIB Section),支援高色深。
  • LR_LOADMAP3DCOLORS:將位圖中 RGB(192,192,192) 背景色自動映射為系統 3D 面板色(COLOR_3DFACE),解決不同色彩方案下的背景不匹配問題。
  • ILC_COLOR8:指定 8-bit 調色盤模式(256 色);若需 24-bit 真彩可用 ILC_COLOR24,但須注意 LR_LOADMAP3DCOLORS 僅適用於調色盤位圖。
  • 最後務必呼叫 SetImageList 替換工具列內建圖像清單,否則變更不生效。

延伸應用

同樣技術可直接用於 CListView、CListCtrl、Rebar 等所有基於 CImageList 的控件,只需在建立圖像清單時指定 ILC_COLOR8 或 ILC_COLOR24 並配合 LoadImage 載入高色深位圖即可。

範例程式 TBColor 完整演示了工具列 256 色圖示的載入與顯示,編譯執行即可見到色彩豐富的工具列按鈕。

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