效果演示

實現要點
- 使用
CReBar 容器承載工具欄,支持背景位圖與帶狀佈局。
- 工具欄創建時指定
TBSTYLE_FLAT | TBSTYLE_TRANSPARENT 實現扁平透明風格。
- 分別設置熱態圖標(鼠標懸停時顯示,22x22)與冷態圖標(正常狀態,19x19),均使用
CImageList 加載圖標資源。
- 手動設置按鈕寬度、文字、命令 ID 及消息映射。
核心代碼片段
BOOL CMainFrame::CreateExToolBar()
{
if (!m_wndReBar.Create(this)) return FALSE;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC))
return FALSE;
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 80);
// 熱態圖標 (22x22)
CImageList imgHot;
imgHot.Create(22, 22, ILC_COLOR8|ILC_MASK, 2, 2);
imgHot.SetBkColor(::GetSysColor(COLOR_BTNFACE));
imgHot.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_GETBUTTON)); // 0 收信
// ... 添加其它圖標
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&imgHot);
imgHot.Detach();
// 冷態圖標 (19x19)
CImageList imgCold;
imgCold.Create(19, 19, ILC_COLOR8|ILC_MASK, 2, 2);
imgCold.SetBkColor(::GetSysColor(COLOR_BTNFACE));
imgCold.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_GETBUTTON));
// ...
m_wndToolBar.GetToolBarCtrl().SetImageList(&imgCold);
imgCold.Detach();
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT|CBRS_TOOLTIPS|TBSTYLE_TRANSPARENT|TBBS_CHECKBOX);
m_wndToolBar.SetButtons(NULL, 21);
m_wndToolBar.SetButtonInfo(0, IDC_WRITEMSG, TBSTYLE_BUTTON, 1);
m_wndToolBar.SetButtonText(0, _T("寫信"));
// ... 其它按鈕
CRect rc; m_wndToolBar.GetItemRect(0, &rc);
m_wndToolBar.SetSizes(rc.Size(), CSize(20,20));
m_wndReBar.AddBar(&m_wndToolBar);
REBARBANDINFO rbbi = { sizeof(rbbi) };
rbbi.fMask = RBBIM_CHILDSIZE|RBBIM_IDEALSIZE|RBBIM_SIZE|RBBIM_BACKGROUND;
rbbi.cxMinChild = rc.Width(); rbbi.cyMinChild = rc.Height();
rbbi.hbmBack = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_TOOLBARBKMAP));
rbbi.cx = rbbi.cxIdeal = rc.Width() * 10;
m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi);
return TRUE;
}
使用說明
- 在
CMainFrame 添加 CReBar m_wndReBar 成員。
OnCreate 中調用 CreateExToolBar(),並刪除原有工具欄創建代碼。
- 每個按鈕的 ID、圖標、文字、消息處理需手動添加(ClassWizard 不支持自動生成)。