在寫程式碼的過程中,程式需要讀取CTreeViewCtrl的根節點下的次級節點,並生成到子選單加入到葉子列表的右鍵選單中,實際操作如下:
1)刪除原有的選單
   
這一步很重要,因為動態生成的選單隻要加進去是不會自己刪除的
    //先刪除原有的menu
    CMenuHandle menu =
pMenu->GetSubMenu(0).GetSubMenu(MY_MOVE_FRIENT_MENU_POS);
//MY_MOVE_FRIENT_MENU_POS定義在程式起始處,為該二級選單在右鍵選單中的位置
    for (int i =
menu.GetMenuItemCount(); i > 0; i–)
    {
        menu.RemoveMenu(i,
MF_BYPOSITION);
    }   
2)讀取CTreeView的次級節點
//先讀取CTreeViewCtrl的根節點
HTREEITEM  hRoot =
m_wndLocalList.GetRootItem();
//讀取CTreeViewCtrl的第一個孩子節點,即第一個子節點
HTREEITEM hFirst =
m_wndLocalList.GetChildItem(hRoot);
3)插入到子選單中
while(hFirst != NULL)
{   
    if (strFirst.Compare(
strItemSelParent)!= 0)
    {//判斷語句,對本子節點的父幾點不進行插入操作
       
menu.InsertMenu(-1, MF_BYPOSITION|MF_STRING,
(UINT)ID_MENU_ADD_FRIEND_TO_GROUP+(*piMenuID), strFirst);
        *piMenuID =
*piMenuID + 1;
    }
//執行插入選單操作或者跳過插入操作後,均需要獲取下一個節點物件      
hFirst = m_wndLocalList.GetNextItem(hFirst,TVGN_NEXT);
   
m_wndLocalList.GetItemText(hFirst,strFirst);
}
4)對選單的響應
    在BEGIN_MSG_MAP()與END_MSG_MAP中新增
COMMAND_RANGE_HANDLER(ID_MENU_ADD_FRIEND_TO_GROUP,ID_MENU_ADD_FRIEND_TO_GROUP+100,OnMenuAddToFriendGroupRange)
COMMAND_RANGE_HANDLER來設定選單ID範圍,你的動態選單的ID只要放在這個範圍就行了
ID_MENU_ADD_FRIEND_TO_GROUP定義為一個const int數字與resource.h中
程式中使用OnMenuAddToFriendGroupRange(WORD, WORD pos, HWND,
BOOL&)來對選單進行響應
//獲取當前選擇的專案
HTREEITEM hItemSel =
m_wndLocalList.GetSelectedItem();
//刪除
m_wndLocalList.DeleteItem(hItemSel);
//插入新專案,hGroupItem需要遍歷比較才能獲得
HTREEITEM hNewItem =
m_wndLocalList.InsertItem(strSelectedText, hGroupItem, TVI_SORT);
//上次給伺服器資訊
add_to_group();