程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> WTL中動態菜單的實現

WTL中動態菜單的實現

編輯:關於C語言

在寫代碼的過程中,程序需要讀取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();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved