使用CMenu弹出多级子菜单,如何得到多级子菜单所选中的每一项

hqkainett 2019-07-23 11:26:20
大佬们好,求助个问题,我现在使用CMenu类创建了一个包含三级子菜单的menu,当弹出menu时,我选中了第三级子菜单的某个选项,现在问题是,如何得到我选中的是每个子菜单中的哪一项呢,我看api好像没找到能得到当前子菜单项的接口额,请大家帮忙看看,多谢了
...全文
449 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2019-07-27
  • 打赏
  • 举报
回复
类似的 查 popup 的代码:

BOOL CxxxxxxDlg::GetMenuPath(HMENU hMenu, UINT uIDM, CStringArray &szPath)
{//按位置搜索ID
int all=GetMenuItemCount(hMenu);
for(int i=0; i < all; i++)
{
int ID=GetMenuItemID(hMenu,i);
char menuName[128];
if(ID==-1)
{// popup menu
if(GetMenuPath(GetSubMenu(hMenu,i), uIDM, szPath))
{
GetMenuString(hMenu , i, menuName, sizeof(menuName), MF_BYPOSITION);
szPath.InsertAt(0, menuName);
return TRUE;
}
}
else if(ID == (int)uIDM) //ID匹配
{
GetMenuString(hMenu , i, menuName, sizeof(menuName), MF_BYPOSITION);
szPath.InsertAt(0, menuName);
return TRUE;
}
}
return FALSE;
}
hqkainett 2019-07-26
  • 打赏
  • 举报
回复
多谢各位大佬,问题已解决,结帖
schlafenhamster 2019-07-25
  • 打赏
  • 举报
回复
就是因为cmenu不是 窗口 , 没有 Getparent 一说 , 必须 从头 (根 GetMenu)开始 遍历 所有 Popup menu
hqkainett 2019-07-25
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
可以通过菜单的位置
额,大佬吧,不好意思,不太明白您的意思
zgl7903 2019-07-25
  • 打赏
  • 举报
回复
可以通过菜单的位置
hqkainett 2019-07-25
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
有子菜单的 POPUP 的菜单是没有ID的
那有没有办法知道我前两级菜单选中了哪一项么
zgl7903 2019-07-25
  • 打赏
  • 举报
回复
有子菜单的 POPUP 的菜单是没有ID的
hqkainett 2019-07-25
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
参考: // menu if(!m_wndMenu.LoadMenu(IDR_MAINFRAME)) { AfxMessageBox("Failed to create menu bar\n"); return -1; // fail to create } //////////////////////////////////////////// int all=m_wndMenu.GetMenuItemCount(); CString name; int ID; for(int i=0;i<all;i++) { m_wndMenu.GetMenuString(i,name,MF_BYPOSITION); ID=m_wndMenu.GetMenuItemID(i); if(ID==-1) // -1=POPUP; 0= SEPERATOR { afxDump << name << ";" << "Popup\n"; int suball; CString subName; int subID; CMenu *pSub=m_wndMenu.GetSubMenu(i); suball =pSub->GetMenuItemCount(); for(int j=0;j<suball;j++) { pSub->GetMenuString(j,subName,MF_BYPOSITION); subID=pSub->GetMenuItemID(j); afxDump << subName << ";" << subID << "\n"; } } }
大佬好,那我想得到每个弹出的下拉菜单中的选中的id呢,您说的这个方法我试过,这个只能得到最后的那个弹出菜单的id,前面两级弹出菜单所选中的id我也需要得到,这个有没有办法获取呢,多谢
schlafenhamster 2019-07-24
  • 打赏
  • 举报
回复
参考:
// menu
if(!m_wndMenu.LoadMenu(IDR_MAINFRAME))
{
AfxMessageBox("Failed to create menu bar\n");
return -1; // fail to create
}
////////////////////////////////////////////
int all=m_wndMenu.GetMenuItemCount();
CString name;
int ID;
for(int i=0;i<all;i++)
{
m_wndMenu.GetMenuString(i,name,MF_BYPOSITION);
ID=m_wndMenu.GetMenuItemID(i);
if(ID==-1) // -1=POPUP; 0= SEPERATOR
{
afxDump << name << ";" << "Popup\n";
int suball;
CString subName;
int subID;
CMenu *pSub=m_wndMenu.GetSubMenu(i);
suball =pSub->GetMenuItemCount();
for(int j=0;j<suball;j++)
{
pSub->GetMenuString(j,subName,MF_BYPOSITION);
subID=pSub->GetMenuItemID(j);
afxDump << subName << ";" << subID << "\n";
}
}
}
schlafenhamster 2019-07-24
  • 打赏
  • 举报
回复
LoadMenu 后, 遍历 menu 记录 hMenu 。
zgl7903 2019-07-23
  • 打赏
  • 举报
回复
TrackPopupMenu 时 uFlags 设置 TPM_RETURNCMD, 然后返回值就是菜单ID
zgl7903 2019-07-23
  • 打赏
  • 举报
回复
GetMenuItemInfo 逐级去枚举菜单信息比对
hqkainett 2019-07-23
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
TrackPopupMenu 时 uFlags 设置 TPM_RETURNCMD, 然后返回值就是菜单ID
大佬好,我目前想得到的是,我弹出三级菜单后,选择了最后一级菜单的某一项,我怎么才能得到我每一级菜单所选项

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧