【问题标题】:how to add message map to dynamic menu item in MFC如何将消息映射添加到 MFC 中的动态菜单项
【发布时间】:2009-12-22 12:03:01
【问题描述】:

我正在编写一个具有列表视图控件的 MFC。当用户右键单击任何项​​目时,我将生成一个动态菜单项,其中包含在列表视图中选择的文本。一切都正常显示,但我不知道如何将消息映射添加到该动态菜单项。

有什么帮助吗?

void CMyListDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        // TODO: Add your control notification handler code here


        int nIndex = m_List.GetSelectionMark();
        CString pString = m_List.GetItemText(nIndex,1);
        CMenu menu, * pSubMenu;
        int pos=0;
        menu.LoadMenu(IDR_MENU1);
        pSubMenu = menu.GetSubMenu (0);
        pSubMenu->DeleteMenu(0,MF_BYPOSITION);
        pSubMenu->InsertMenu(pos,MF_BYPOSITION,NULL,pString);
            CPoint oPoint;
        GetCursorPos (& oPoint);
        pSubMenu-> TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this);






        *pResult = 0;
    }

【问题讨论】:

    标签: visual-studio mfc visual-c++ contextmenu popupmenu


    【解决方案1】:

    此时您正在插入 ID = 0 (NULL) 的菜单项。这样你就无法确定按下了哪个命令。您必须为该项目分配一个ID,最简单的一个是

    #define WM_MYMESSAGE WM_USER + 1
    

    然后你像这样插入它:

    pSubMenu->InsertMenu(pos,MF_BYPOSITION,WM_MYMESSAGE,pString);
    

    如果您为您的窗口覆盖 OnCommand,您的 ID 为 wParam。 要真正弄清楚发生了什么,请将一些附加信息存储在另一个班级成员中,例如 m_nLastItemClicked 或......你明白了吗?!

    【讨论】:

    • 我不完全明白如何覆盖 onCommand,我的消息映射目前有这个 ON_COMMAND(IDM_FILE_OPEN, OnFileOpen)
    • 您只需添加 ON_COMMAND(WM_MYMESSAGE, OnMyMessage) 处理程序,假设您在 InsertMenu 上使用了 WM_MYMESSAGE
    【解决方案2】:

    查看MFCIE sample,它会从用户的收藏夹中生成收藏夹菜单,并在点击收藏夹菜单项时导航到收藏夹网址。

    【讨论】:

      【解决方案3】:

      只需为您的类中的菜单项 ID 添加ON_COMMAND(和ON_UPDATE_COMMAND_UI,如有必要)处理程序。

      【讨论】:

      • 但这些是动态菜单项,我不知道它们的 ID
      • 你知道可能的身份证号码的范围吗?在这种情况下,您可以添加 ON_COMMAND_RANGE
      • 我只生成一个菜单项。我尝试使用 ON_COMMAND_RANGE,但可以理解如何将其用于未知(只有 1 个)动态菜单
      • @dwo 提供了正确答案,我没有意识到您正在插入带有 NULL 作为 ID 的菜单项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多