如何在 CTreeCtrl 上添加右鍵選單

創建好 CTreeCtrl 之後最重要的就是要增加他的右鍵選單功能了

Visual DSP++ 的 CTreeCtrl 竟然有四層架構 (OMG)

還是一步一步來先嘗試看看要怎麼讓選中的 TreeItem 可以彈出右鍵選單

2014-07-17-01

 

[實作過程]

1. 首先在 .h 檔中定義右鍵消息函數:

afx_msg void OnRBClick(NMHDR* pNMHDR, LRESULT* pResult);

2. 然后在 .cpp 檔的消息循環中定義消息對應關係:

ON_NOTIFY(NM_RCLICK, IDC_MYTREECTRL, OnRbClick)

3. 接著定義消息函數內容:

void CMainFrame::OnRBClick(NMHDR* pNMHDR, LRESULT* pResult)
{
 CPoint point;
 GetCursorPos(&point);
 CPoint pointInTree = point;
 m_wndTree.ScreenToClient(&pointInTree);
 HTREEITEM item;
 UINT flag = TVHT_ONITEM;
 item = m_wndTree.HitTest(pointInTree, &flag);
 if(item != NULL)
 {
  m_wndTree.SelectItem(item);
  CMenu menu;
  menu.LoadMenu(IDR_POPMENU);
  menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | 
  TPM_RIGHTBUTTON, point.x, point.y, this, NULL);
 }
}

IDR_POPMENU 是用資源檢視編輯器所產生的 menu

IDC_MYTREECTRL 是在 Docking Windows 上添加控制項 (控件) 時所定義好的ID (步驟3、第6行)

 

[參考資料]

1. 如何给CTreeCtrl 添加右键菜单