受 QQ 經典選單風格啟發,作者開發了 CMenuEx 類別,提供 **漸層背景、選中高亮、文字陰影、縱向圖示欄 (像 Windows 開始選單)、主選單與彈出選單統一介面** 等功能。本文詳細說明介面函數、使用步驟、資源匹配技巧與顏色設定。

| 函數 | 用途 |
|---|---|
InitMenu(CMenu*, UINT uToolBar, CToolBar*) | 主選單初始化 (於 OnInitMenu 調用),需工具列物件取得按鈕圖示 |
SetHighLightColor(COLORREF) | 設定選中項目文字色 (建議 RGB(0,0,127) 深藍) |
SetBackColor(COLORREF) | 設定選單背景色 (建議 RGB(143,167,207) 淺藍灰) |
SetTextColor(COLORREF) | 設定一般文字色 (建議 RGB(0,0,0) 黑) |
SetImageLeft(UINT uBmpID) | 設定左側縱向圖示欄位圖 (寬高比例需配合選單高度) |
InitPopupMenu(CMenu*, UINT, CToolBar*) | 彈出選單初始化 (含一級選單),於 WM_INITMENUPOPUP 調用 |
DrawItem / MeasureItem | 繪製/測量核心虛函數,需在框架 OnDrawItem/OnMeasureItem 中轉發 |
TrackPopupMenu(...) | 追蹤顯示彈出選單 (右鍵選單等) |
CreatePopupMenu / AppendMenu / DestroyMenu | 動態建立彈出選單標準流程 |
CMenuEx m_menu;OnInitMenu:m_menu.InitMenu(pMenu, IDR_MAINFRAME, &m_wndToolBar);void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{ if (!nIDCtl) m_menu.DrawItem(lpDIS); }
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS)
{ if (!nIDCtl) m_menu.MeasureItem(lpMIS); }
注意: 工具列位圖按鈕數量必須與選單項 ID 一一對應,否則圖示會錯位。刪除多餘位圖或補齊選單項即可修正。
OnCreate 中:m_menu.SetImageLeft(IDB_BITMAP_LEFT); (需準備合適寬高比位圖)。
CChildView 成員:CMenuEx m_menu; CToolBar* m_pToolBar;CMainFrame* pF = (CMainFrame*)AfxGetMainWnd(); m_pToolBar = &pF->m_wndToolBar; (需將工具列改 public)。m_menu.CreatePopupMenu();
m_menu.AppendMenu(0, ID_EDIT_UNDO, _T("復原"));
m_menu.AppendMenu(MF_SEPARATOR);
m_menu.AppendMenu(0, ID_EDIT_COPY, _T("複製"));
m_menu.AppendMenu(0, ID_EDIT_CUT, _T("剪下"));
m_menu.AppendMenu(0, ID_EDIT_PASTE, _T("貼上")); // ID 與工具列按鈕一致才顯示圖示
m_menu.DestroyMenu();WM_INITMENUPOPUP:if (!bSysMenu) m_menu.InitPopupMenu(pPopupMenu, IDR_MAINFRAME, m_pToolBar);WM_CONTEXTMENU:m_menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, this);m_menu.SetHighLightColor(RGB(0, 0, 127)); // 選中深藍字 m_menu.SetTextColor(RGB(0, 0, 0)); // 一般黑字 m_menu.SetBackColor(RGB(143, 167, 207)); // 背景淺藍灰
CMenuEx 實例 **只能調用 InitMenu 或 InitPopupMenu 其中之一**,不可混用。這個類別雖非完整框架級方案,但介面清晰、核心繪製邏輯 (漸層、圖示欄、高亮) 具備參考價值,適合整合至專案自有 UI 庫中。