MFC AppWizard 產生的標準選單僅支援純文字,現代應用需求:圖示、熱追蹤高亮、灰色停用、核取標記等,皆需自行繪製。
| 函式 | 用途 | 關鍵結構 |
|---|---|---|
MeasureItem | 告知系統選單項目寬高 | MEASUREITEMSTRUCT |
DrawItem | 實際繪製圖示、文字、背景、狀態效果 | DRAWITEMSTRUCT |
CtlType == ODT_MENU 確認為選單項目itemID:選單項目命令 IDitemAction:ODA_DRAWENTIRE 全部重繪、ODA_SELECT 選取狀態變化、ODA_FOCUS 焦點變化itemState 組合旗標:ODS_SELECTED、ODS_GRAYED、ODS_DISABLED、ODS_HOTLIGHT(滑鼠懸停)、ODS_CHECKED 等hDC:繪圖裝置內容rcItem:項目矩形區域(座標原點為選單左上角,需自行換算)itemData:攜帶自訂資料(圖示控制碼、文字指標等),由 AppendMenu/InsertMenu/ModifyMenu 傳入class CMenuEx : public CMenu
{
public:
// 主介面:依工具列按鈕自動建立圖示對應
void InitMenu(CMenu* pMenu, UINT uToolBar, CToolBar* pToolBar);
// 垂直左側位圖(如 Windows 開始選單)
void SetImageLeft(UINT idBmpLeft);
// 右鍵彈出式選單專用
void InitPopupMenu(CMenu* pMenu, UINT uToolBar, CToolBar* pToolBar);
// 從工具列按鈕提取圖示
int GetImageFromToolBar(UINT uToolBar, CToolBar* pToolBar, COLORREF crMask);
protected:
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};
ModifyMenu(id, MF_BYCOMMAND | MF_OWNERDRAW, id, (LPCTSTR)itemData) 或建立時 AppendMenu(MF_OWNERDRAW | MF_STRING, id, (LPCTSTR)itemData)。itemWidth/itemHeight。itemState 選擇背景筆刷(選取藍底、停用灰底、熱追蹤淡藍)ODS_CHECKED)itemData 取得圖示控制碼,DrawIconEx 繪製DrawText 繪製文字,支援快捷鍵底線(DT_HIDEPREFIX)SetImageLeft 設定垂直位圖,在左側畫區塊填滿// 主框架 OnCreate 中
m_menuEx.InitMenu(&m_wndMenuBar, IDR_MAINFRAME, &m_wndToolBar);
m_menuEx.SetImageLeft(IDB_BITMAP_LEFT); // 可選:垂直位圖
// 右鍵選單
CMenuEx* pPopup = new CMenuEx;
pPopup->InitPopupMenu(pMenu, IDR_POPUP, &m_wndToolBar);
pPopup->TrackPopupMenu(TPM_LEFTALIGN, x, y, this);
GetDpiForWindow + 向量圖示)