資源管理器、IE 等系統程序工具欄圖標色彩豐富(256 色甚至真彩),而普通 MFC 應用工具欄僅支持 16 色,視覺效果大打折扣。本文通過替換工具欄底層圖像列表,實現應用程序工具欄的高彩色顯示。
IDR_MAINFRAME Toolbar 資源,按鈕圖標以無縫長條位圖(BMP)存儲,運行時載入 CImageList,工具欄按索引從中取圖。CImageList,再用 SetImageList() 替換工具欄默認圖像列表。N*M,寬 M。IDB_TOOLBAR)。注意:真彩位圖導入後無法在資源視圖編輯。IDR_MAINFRAME Toolbar 資源配置。CMainFrame::OnCreate() 中)HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_TOOLBAR), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
LR_CREATEDIBSECTION 創建 DIB 段,保留顏色信息;LR_LOADMAP3DCOLORS 映射 3D 顏色。
CBitmap bm;
bm.Attach(hbm);
m_ilToolBar.Create(32, 32, ILC_COLOR8, 4, 4); // 256色
m_ilToolBar.Add(&bm, (CBitmap*)NULL);
顏色深度常量(commctrl.h):
| 常量 | 值 | 含義 |
|---|---|---|
ILC_COLOR4 | 0x0004 | 16 色 |
ILC_COLOR8 | 0x0008 | 256 色 |
ILC_COLOR16 | 0x0010 | 16 位色 (High Color) |
ILC_COLOR24 | 0x0018 | 24 位色 (True Color) |
ILC_COLOR32 | 0x0020 | 32 位色 (含 Alpha) |
多數程序 256 色(ILC_COLOR8)已足夠。
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
將工具欄控件的圖標來源指向包含高彩色位圖的圖像列表 m_ilToolBar。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// ... 原有工具欄創建代碼 ...
// 高彩色工具欄實現
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_TOOLBAR), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
if (hbm) {
CBitmap bm; bm.Attach(hbm);
m_ilToolBar.Create(32, 32, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm, (CBitmap*)NULL);
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
}
return 0;
}
通過自建高彩色圖像列表替換工具欄默認圖像列表,繞過 VC 資源編輯器 16 色限制,讓普通 MFC 應用擁有媲美系統程序的精美工具欄。關鍵在於 LoadImage 載入 DIB、CImageList::Create 指定色深、SetImageList 替換數據源三步。