早期開發者常羨慕 QQ 選單的精美外觀。隨著技術累積,作者設計了 CMenuEx 類別,實現支援圖示、自訂顏色、垂直位圖等功能的自繪選單,並開源供參考。
| 方法 | 說明 |
|---|---|
InitMenu() | 主要介面,在主視窗 OnInitMenu() 中呼叫,需搭配工具列產生選單項位圖,並需重載 OnMeasureItem()、OnDrawItem() |
InitPopupMenu() | 包含第一層選單的自繪初始化,與 InitMenu() 二擇一使用 |
SetHighLightColor() | 設定高亮文字顏色(QQ 風格建議:RGB(0,0,127)) |
SetBackColor() | 設定背景顏色(QQ 風格建議:RGB(143,167,207)) |
SetTextColor() | 設定一般文字顏色(建議:RGB(0,0,0)) |
SetImageLeft() | 設定垂直位圖(類似「開始」選單),需注意長寬比例 |
CMenuEx m_menuCMainFrame 加入 WM_INITMENU 訊息,實作中呼叫:m_menu.InitMenu(pMenu, IDR_MAINFRAME, &m_wndToolBar);WM_DRAWITEM、WM_MEASUREITEM 訊息:if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);
if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);OnCreate() 中啟用垂直位圖:m_menu.SetImageLeft(IDB_BITMAP1);常見問題:若選單位圖錯位,通常是工具列位圖數量與按鈕數量不符,調整使兩者一致即可。
CChildView 加入 CMenuEx m_menu 與 CToolBar* m_pToolBarInitInstance() 或 OnCreate() 中設定)m_menu.CreatePopupMenu();
m_menu.AppendMenu(0, ID_EDIT_UNDO, "撤消");
m_menu.AppendMenu(MF_SEPARATOR, 0);
m_menu.AppendMenu(0, ID_EDIT_COPY, "複製");
// 選單 ID 與工具列按鈕 ID 相同時自動顯示位圖m_menu.DestroyMenu();WM_INITMENUPOPUP 訊息呼叫 InitPopupMenu()WM_CONTEXTMENU 訊息顯示選單:m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);m_menu.SetHighLightColor(RGB(0,0,127));
m_menu.SetTextColor(RGB(0,0,0));
m_menu.SetBackColor(RGB(143,167,207));
CMenuEx 封裝了複雜的自繪邏輯,提供豐富的自訂介面,讓開發者輕鬆打造專業級選單介面。原始碼開放供進一步擴充與學習。