如何将消息映射添加到 MFC 中的动态菜单项

Posted

技术标签:

【中文标题】如何将消息映射添加到 MFC 中的动态菜单项【英文标题】:how to add message map to dynamic menu item in 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;
    

【问题讨论】:

【参考方案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 的菜单项。

以上是关于如何将消息映射添加到 MFC 中的动态菜单项的主要内容,如果未能解决你的问题,请参考以下文章

vs2013怎么用mfc添加菜单项消息响应函数

MFC SDI中 如何为动态创建的按钮添加消息处理函数

MFC SDI中 如何为动态创建的按钮添加消息处理函数

消息映射 MFC:继承多个消息映射

027.MFC_映射消息

MFC中添加的菜单项为啥始终是灰色的