// 编写菜单
CMenu PopupMenu;
// 创建弹出菜单
BOOL bRet = PopupMenu.CreatePopupMenu();
int nMenuID = 100;
bRet = PopupMenu.AppendMenu(MF_ENABLED,nMenuID,L"测试");
// 显示菜单
int nCmd = PopupMenu.TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);
// 销毁菜单
PopupMenu.DestroyMenu(); CString strDebug;
strDebug.Format(L"%d",nCmd);
AfxMessageBox(strDebug);设置了TPM_RETURNCMD,本来想获取选择的menuitem的Cmd ID,结果TrackPopupMenu直接返回了,菜单一闪提示 strDebug为0值。怎么回事??用法有问题么?

解决方案 »

  1.   

    获取菜单选择的ID 可以响应 WM_COMMAND
    wNotifyCode = HIWORD(wParam); // notification code 
    wID = LOWORD(wParam);         // item, control, or accelerator identifier 
    hwndCtl = (HWND) lParam;      // handle of control 
      

  2.   

    我这个用法的问题?我用一个demo工程测试就可以,就是我自己的工作工程不行!郁闷
      

  3.   

    PopupMenu.TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);这里的问题,TPM_LEFTALIGN | TPM_RIGHTBUTTON直接这样就行了
      

  4.   

    TPM_RIGHTBUTTON 是右键继续可以打开菜单,这样是不行的。这个意思是说可以继续打开多个菜单而已。
      

  5.   

    邪乎。居然发现时CListView的CListCtrl控件的风格设置影响了OnContextMenu。void CMENU_TestView::OnInitialUpdate()
    {
    CListView::OnInitialUpdate(); // TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,
    //  从而可以用项填充 ListView。 CListCtrl& MyListCtrl = GetListCtrl();

    // 更新CListCtrl显示样式
    MyListCtrl.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL);
    //DWORD dwExStyle=MyListCtrl.GetExtendedStyle();
    //MyListCtrl.SetExtendedStyle(dwExStyle|LVS_EX_FULLROWSELECT);
    }
    这里如果设置了LVS_SINGLESEL单选风格,TrackPopupMenu就会失败,直接返回0.如果不设置这个style那么就可以了。太邪乎了。这是怎么回事????