在寫程式碼的過程中,程式需要讀取CTreeViewCtrl的根節點下的次級節點,並生成到子選單加入到葉子列表的右鍵選單中,實際操作如下:
1)刪除原有的選單
這一步很重要,因為動態生成的選單隻要加進去是不會自己刪除的
//先刪除原有的menu
CMenuHandle menu =
pMenu->GetSubMenu(0).GetSubMenu(MY_MOVE_FRIENT_MENU_POS);
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的次級節點
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&)來對選單進行響應
//獲取當前選擇的專案
BOOL&)來對選單進行響應
//獲取當前選擇的專案
HTREEITEM hItemSel =
m_wndLocalList.GetSelectedItem();
//刪除
m_wndLocalList.DeleteItem(hItemSel);
m_wndLocalList.GetSelectedItem();
//刪除
m_wndLocalList.DeleteItem(hItemSel);
//插入新專案,hGroupItem需要遍歷比較才能獲得
HTREEITEM hNewItem =
m_wndLocalList.InsertItem(strSelectedText, hGroupItem, TVI_SORT);
HTREEITEM hNewItem =
m_wndLocalList.InsertItem(strSelectedText, hGroupItem, TVI_SORT);
//上次給伺服器資訊
add_to_group();
add_to_group();