弹出菜单怎样弹出整个菜单,而不是子菜单?

FlyYang 2005-10-12 03:34:31
//一般我们是这样做的:
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU));

CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
//然后弹出
pPopup->TrackPopupMenu(...);

//现在我想弹出整个菜单
menu.TrackPopupMenu(...);
//为什么现在就要出问题,第一级菜单显示不完,只能是一个小条条
...全文
263 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atry 2005-10-13
  • 打赏
  • 举报
回复
所以结论是没有简便的方法,除非自己去实现一个LoadPopupMenu,当然,这个函数内部,你还是得用CreatePopupMenu,然后读资源,一项一项再加进去
Atry 2005-10-13
  • 打赏
  • 举报
回复
MFC的LoadMenu是调用Win32 API的 LoadMenu,而LoadMenu这个API不能生成弹出菜单
teli_eurydice 2005-10-13
  • 打赏
  • 举报
回复
呵呵,你也是有星星的人了,我给你一个大概的例子 ,你自己想想,不好意思,比较忙


CMenu mnu;
VERIFY(mnu.LoadMenu (IDR_MENU_TAB));
CMenu* pPopup = mnu.GetSubMenu (0);

CMenu pop;
VERIFY(pop.LoadMenu (IDR_CTX_DIAGRAM));
pPopup->AppendMenu(MF_STRING | MF_POPUP | MF_ENABLED,(UINT)pop.GetSubMenu(0)->m_hMenu,"底图");
CMenu pop2;
VERIFY(pop2.LoadMenu (IDR_GEOCOLTYPE));
pPopup->AppendMenu(MF_STRING | MF_POPUP | MF_ENABLED,(UINT)pop2.GetSubMenu(4)->m_hMenu,"插入");
pPopup->AppendMenu(MF_STRING | MF_POPUP | MF_ENABLED,(UINT)pop2.GetSubMenu(5)->m_hMenu,"单井图");
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
windows设计弹出菜单的主要目的是用于当用户在某个项目上点击鼠标右键时,方便其对所选项目的操作,所以根本没有考虑把整个象主菜单那样的菜单直接传换成弹出菜单的功能,或许我的认识很有限。
wuchi 2005-10-12
  • 打赏
  • 举报
回复
要不再来一个绝点的,把你的菜单加到一个对话框上,弹出这个对话框即可
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
好象没有你想要的快捷方法,至少我不会,学习学习。
wuchi 2005-10-12
  • 打赏
  • 举报
回复
可以这样设计,相当于原来竖向展开的变成横向展开
就是把文件,编辑,窗口之类的作为弹出子菜单的项
FlyYang 2005-10-12
  • 打赏
  • 举报
回复
To:zxyjyzxyjy(星星)
我的意思还没有说明白
比如说,主框架的菜单资源是IDR_MAINFRAME,该菜单既要用在主框架,又要用在弹出菜单里
我的意思是要用一种很简便快捷的方法,不要去绕
wuchi 2005-10-12
  • 打赏
  • 举报
回复
改变一下主框架的菜单资源IDR_MAINFRAME的样式
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
那自已写程序来搜主菜单的东西来加入这个弹出菜单了,不然MFC好象没有提供你说的情况。
快乐鹦鹉 2005-10-12
  • 打赏
  • 举报
回复
这个函数只能弹出弹出式菜单。这种顶层菜单没有什么办法。
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
变通一下,按我上面说的,行,把顶级菜单放在一级,再建下一级,层层下去。

void CZxydlgDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu m_pMenu;
ClientToScreen(&point);
m_pMenu.LoadMenu(IDR_MENU1);
CMenu* pPopup = m_pMenu.GetSubMenu(0);

pPopup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
CDialog::OnRButtonDown(nFlags, point);
}
FlyYang 2005-10-12
  • 打赏
  • 举报
回复
/////////////////////////////////
说的是不是这个意思,把如文件,编辑,窗口之类的作为顶级菜单,把每个下面的作为下级菜单,如果这样要弹出的话,那何别用LoadMenu做,可不可以把你的顶级菜单放在一个弹出菜单里,每一个再来一个下级菜单,多级单出菜单那样做。
/////////////////////////////////
说的没错,但是
比如说,主框架的菜单资源是IDR_MAINFRAME,我想在其他地方用弹出菜单弹出,如果用 上述方法,那么就还要添加一个菜单资源,然后复制过去,每次改动一个地方,会影响其他地方,这样的菜单多了维护难
goodboyws 2005-10-12
  • 打赏
  • 举报
回复
好像就是这样了,你也可以资源里把所有的东西都放到子菜单里,顶层用1.2.3.4来区分
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
说的是不是这个意思,把如文件,编辑,窗口之类的作为顶级菜单,把每个下面的作为下级菜单,如果这样要弹出的话,那何别用LoadMenu做,可不可以把你的顶级菜单放在一个弹出菜单里,每一个再来一个下级菜单,多级单出菜单那样做。
FlyYang 2005-10-12
  • 打赏
  • 举报
回复
==你这个menu是弹出式菜单么?
VERIFY(menu.LoadMenu(IDR_MENU));
看这句就知道了
==这句话就能证明menu是弹出式菜单????!!!你如何证明啊?这只能证明它是菜单!
menu.LoadMenu(IDR_MENU));不可能变成弹出式菜单吧
就是不是弹出式菜单,但我想弹出
快乐鹦鹉 2005-10-12
  • 打赏
  • 举报
回复
==你这个menu是弹出式菜单么?
VERIFY(menu.LoadMenu(IDR_MENU));
看这句就知道了
==这句话就能证明menu是弹出式菜单????!!!你如何证明啊?这只能证明它是菜单!
FlyYang 2005-10-12
  • 打赏
  • 举报
回复
>>顶级菜单不可以用TrackPopupMenu显示,因为windows认为它不是一个弹出式菜单
那我要弹出顶级菜单,就需要在创建一个弹出菜单,然后把要弹出的顶级菜单一项一项的加进来不是很麻烦,应该有简便方法
wuchi 2005-10-12
  • 打赏
  • 举报
回复
mark
FlyYang 2005-10-12
  • 打赏
  • 举报
回复
==你这个menu是弹出式菜单么?
VERIFY(menu.LoadMenu(IDR_MENU));
看这句就知道了
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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