早期 VC++ 工具欄僅支持 16 色圖標,高色彩圖標加載後失真。雖可用高色彩位圖替代,但繪圖工具支持有限。本文介紹利用 CImageList + CToolBarCtrl 直接加載透明高色彩圖標的方法。
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:擴容步長TBCMainFrame 添加成員:CImageList m_ilTB;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 獲取位圖與掩模,可實現複雜透明效果LoadImage 返回的 HICON 需 DestroyIcon 釋放,但 CImageList::Add 內部已複製,原句柄可立即銷毀靈活運用 CImageList::Create 的標志組合(ILC_COLOR8 | ILC_MASK),配合 LoadImage 精確控制加載尺寸,即可在工具欄完美顯示透明高色彩圖標。此法避免了制作大位圖的麻煩,直接復用現有圖標資源,是 MFC 界面美化的實用技巧。