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 色透明圖示列表
CImageList m_ilTB;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;
}
| 函式 | 關鍵參數 | 說明 |
|---|---|---|
CImageList::Create | cx, cy, TRUE|ILC_COLOR8, nInitial, nGrow | 建立 256 色帶遮罩圖示列表 |
LoadImage | hinst, MAKEINTRESOURCE(ID), IMAGE_ICON, 32, 32, 0 | 從資源載入指定尺寸圖示 |
CImageList::Add(HICON) | hIcon | 將圖示加入列表 (內部複製像素與遮罩) |
CToolBarCtrl::SetImageList | &m_ilTB | 替換工具列預設圖示列表 |
VC6.0 CImageList 不直接支援 ILC_COLOR32。若需 Alpha 通道:
ILC_COLOR32)CImageList + GDI+ 手動合成 (較複雜)CImageList::Create(cx, cy, TRUE | ILC_COLOR8, ...) 是在 VC6.0/MFC 實現 256 色透明工具列圖示的標準且最簡潔做法。配合 LoadImage 載入獨立圖示資源,兼顧開發效率與視覺品質。