我用CMenu创建一个弹出菜单
注意不是使用资源形式CMenu popMenu;
popMenu.CreatePopupMenu();
popMenu.AppendMenu(0,1,"hello");
popMenu.AppendMenu(0,2,"bye");popMenu.TrackPopupMenu(nFlags,x,y,pWnd,0);popMenu.DestroyMenu();

解决方案 »

  1.   

    我知道了
    TPM_RETURNCMD
    就可以了
      

  2.   

    void CTesttestDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
    // TODO: Add your message handler code here
    CMenu popMenu;
    popMenu.CreatePopupMenu();
    popMenu.AppendMenu(0,1,"hello");
    popMenu.AppendMenu(0,2,"bye");

    UINT index = ::TrackPopupMenu(popMenu.m_hMenu,TPM_RETURNCMD,point.x,point.y,0,
    pWnd->GetSafeHwnd(),0);
    CString strIndex;
    strIndex.Format("%d",index);
    AfxMessageBox(strIndex);
    popMenu.DestroyMenu();

    }没问题
      

  3.   

    用switch...case判断点击的菜单项,调用相应的函数
    index就是菜单项的标识
      

  4.   

    哦,我想问,是用哪一个消息映射?OnCommand 还是OnCommandRange
    还是其他,谢谢。
      

  5.   

    另外,不管你点击哪一个菜单项都是一样的返回index=1的
      

  6.   

    ::TrackPopupMenu(popMenu.m_hMenu,TPM_RETURNCMD,point.x,point.y,0,
    pWnd->GetSafeHwnd(),0);
    是发往pWnd->GetSafeHwnd()窗口
     
    随你变了 视你菜单完成的功能来决定
      

  7.   

    是不是调用::TrackPopupMenu
    跟调用CMenu中的TrackPopupMenu不一样啊我用API调用后可以返回,但是不能自己绘制特殊效果了
      

  8.   

    要响应的话,你的给每个弹出菜单添加唯一的ID值
    #define IDM_MENU1 10001
    #define IDM_MENU2 10002
    #define IDM_MENU3 10003
    #define IDM_MENU4 10004右键弹出菜单如下
    CMenu menuPopUp, menuChild;
    if (menuPopUp.CreatePopupMenu())
    {
    menuPopup.AppendMenu(MF_STRING, IDM_MENU1, _T("Menu 1"));
    menuPopup.AppendMenu(MF_STRING, IDM_MENU2, _T("Menu 2")); if (menuChild.CreatePopupMenu())
    {
    menuChild.AppendMenu(MF_STRING, IDM_MENU3, _T("Menu 3"));
    menuChild.AppendMenu(MF_STRING, IDM_MENU4, _T("Menu 4")); menuPopup.AppendMenu(MF_POPUP, (UNIT) menuChild.GetSafeHwnd(), _T("Sub Menu"));
    } POINT pt;
    GetCursorPos(&pt);
    menuPopUp.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, this);
    menuPopUp.DestroyMenu();
    }响应菜单可以使用ON_COMMAND宏或者ON_COMMAND_RANGE(菜单ID值连续的菜单)宏
    在头文件中加入如下定义
    afx_msg void OnMenu1();
    afx_msg void OnMenu(UNIT nID);在
    END_MESSAGE_MAP()
    这一句前加入
    ON_COMMAND(IDM_MENU1, OnMenu1)
    ON_COMMAND_RANGE(IDM_MENU2, IDM_MENU4, OnMenu)然后实现OnMenu1函数和OnMenu函数即可,其中OnMenu函数中的唯一一个参数表示你所点击的菜单的ID值
      

  9.   

    不好意思,写错了一点afx_msg void OnMenu(UNIT nID);
    这句应该是
    afx_msg void OnMenu(UINT nID);
      

  10.   

    CMenu popMenu;
    popMenu.CreatePopupMenu();
    popMenu.AppendMenu(0,1,"hello");
    popMenu.AppendMenu(0,2,"bye");popMenu.TrackPopupMenu(nFlags,x,y,pWnd,0);popMenu.DestroyMenu();中的1和2必须是你在菜单中定义的ID,比如IDC_YOURMENUID1,然后生成代码。