為樹形控件添加彈出式菜單,并跟蹤所選擇的項
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
[cpp] view plaincopy
- <span style="font-size:24px;color:#ff0000;">為樹形控件添加彈出式菜單,并跟蹤所選擇的項</span>
- 動態彈出式菜單
- //獲取當前右鍵的位置
- CPoint pt;
- GetCursorPos(&pt);
- m_tree.ScreenToClient(&pt);
- //判斷右鍵的位置處是否是樹形控件的一個節點
- //若有,則彈出右鍵菜單
- HTREEITEM hItem = m_tree.HitTest(pt);
- if(m_tree.GetParentItem(m_tree.GetParentItem(hItem))!=NULL&&m_tree.GetChildItem(hItem)!=NULL)
- bShouldPop=TRUE;
- if(hItem != NULL && bShouldPop)
- {
- m_tree.SelectItem(hItem);
- //彈出菜單的位置,為后面的 TrackPopupMenu() 使用
- GetCursorPos(&pt);
- CMenu popupmenu;
- //生成一個彈出菜單
- popupmenu.CreatePopupMenu();
- ASSERT(popupmenu!=NULL);
- //添加菜單項
- popupmenu.AppendMenu(MF_STRING|MF_ENABLED,IDM_ITEM_SHOW,_T("show"));
- popupmenu.AppendMenu(MF_SEPARATOR);
- popupmenu.AppendMenu(MF_STRING|MF_ENABLED,IDM_ITEM_HIDE,_T("hide"));
- //彈出
- int nCmd=(int)popupmenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,
- pt.x,pt.y,this);
- }
- 也可以用已有的菜單資源彈出一個菜單的子項
- void CLeaveDlg::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult)
- {
- // TODO: Add your control notification handler code here
- CMenu menu;
- menu.LoadMenu(IDR_MENU_SHOW);
- CBitmap bitmap; //為菜單子項添加圖標
- bitmap.LoadBitmap(IDB_BITMAP_BIG);
- deviceTreeMenu.SetMenuItemBitmaps(IDC_MENU_DEVICE_RENAME,MF_BYCOMMAND/*|MF_BYPOSITION*/,
- &bitmap,&bitmap);
- //獲取當前右鍵的位置
- CPoint pt;
- GetCursorPos(&pt);
- m_tree.ScreenToClient(&pt);
- HTREEITEM hSelTree = m_tree.HitTest(pt);
- if ( hSelTree != NULL && m_tree.GetParentItem(hSelTree) != NULL )
- {
- m_tree.SelectItem(hSelTree);
- m_tree.ClientToScreen(&pt);
- menu.GetSubMenu(1)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
- }
- *pResult = 0;
- }
動態創建菜單步驟:
1創建一個基于對話框的應用程序
2在對話框的頭文件中聲明一個CMenu類對象m_Menu;
3打開Resource.h,在此文件中定義命令ID。代碼為:#define ID_MENUCAT 1001
4在對話框的OnInitDialog方法中創建菜單。代碼如下:
m_Menu.CreateMenu(); //創建菜單窗口
CMenu m_PopMenu; //定義菜單類對象
m_PopMenu.CreatePopupMenu(); //創建彈出菜單窗口
m_Menu.AppendMenu(MF_POPUP,(UINT)m_PopMenu.m_hMenu,"動物");//插入菜單
m_PopMenu.AppendMenu(MF_STRING,ID_MENUCAT,"貓"); //插入子菜單
m_PopMenu.Detach(); //分離菜單句柄
SetMenu(&m_Menu);//菜單與窗口關聯
5在對話框的頭文件中聲明菜單的消息處理函數,代碼為 afx_msg void OnMenucat();
6在對話框的源文件中添加消息映射宏,將命令ID關聯到消息處理函數中。代碼如下:
ON_COMMAND(ID_MENUCAT, OnMenucat) //關聯命令ID和消息處理函數
7最后一步,在對話框的源文件中添加消息處理函數的實現代碼
void CCreateMenuDlg::OnMenucat()
{
MessageBox("貓菜單被按下");
}