右鍵選單即彈出式選單。MFC CMenu 類封裝選單操作,核心流程三步驟:
IDR_POPMENU),須包含至少一個子選單(彈出項)。LoadMenu 載入資源 → GetSubMenu(0) 取得第一層子選單指標。TrackPopupMenu 在游標位置顯示並追蹤選擇。BOOL LoadMenu(UINT nIDResource)CMenu* GetSubMenu(int nPos) constBOOL TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect=NULL)
TPM_LEFTALIGN/TPM_CENTERALIGN/TPM_RIGHTALIGNTPM_RIGHTBUTTON(右鍵可連續彈出並選取)、TPM_LEFTBUTTONx, y 為螢幕座標NM_RCLICK 處理器在 CMyView(繼承 CListView)加入 OnRclick。
void CMyView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) {
CListCtrl& list = GetListCtrl(); // 取得內建 ListCtrl 參考
CMenu menu, *pSubMenu;
menu.LoadMenu(IDR_POPMENU); // 載入選單資源
pSubMenu = menu.GetSubMenu(0); // 取得第一層彈出選單
CPoint pt;
GetCursorPos(&pt); // 取得螢幕座標游標位置
int nSel = list.GetSelectionMark(); // 目前選取項索引
CString strText = list.GetItemText(nSel, 0); // 取得第 0 欄文字
strText = "您選擇的路徑是:" + strText;
MessageBox(strText); // 示範:顯示選取內容
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);
*pResult = 0;
}
ON_COMMAND 映射選單項目 ID 到處理函數。pSubMenu(增刪項目、啟用/禁用、打勾)。OnContextMenu(WM_CONTEXTMENU)處理,參數已為螢幕座標,無需 GetCursorPos。GetNextItem(-1, LVNI_SELECTED) 迭代所有選取項。CMenu 解構時自動 DestroyMenu,無需手動釋放。