在写代码的过程中,程序需要读取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();