急救啊!!MFC多个菜单,如何选定指定菜单??

n70joey 2010-05-02 09:45:46
我创建了一个对话框,在里面插入了两个菜单,ID分别是IDR_MAIN_MENU和IDR_RIGHT_CLICK,前一个用来做对话框的菜单,后一个用来做右键弹出的菜单,现在我想在选择右键弹出菜单的菜单中设置一个按键无效。我用语句:
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(1);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

网上说CMenu* submenu = mmenu->GetSubMenu(1);
这个设置为1就可以选择IDR_RIGHT_CLICK,而且0则是IDR_MAIN_MENU,但是仍然无法设置,选择1时,submenu 的地址为空。。。啊。。。。
请问如何选择IDR_RIGHT_CLICK菜单,并对它的按键进行设置无效??
...全文
440 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
n70joey 2010-05-05
  • 打赏
  • 举报
回复
我知道为什么了
n70joey 2010-05-03
  • 打赏
  • 举报
回复
唉,就是这样才烦,之前看到有人说这样是可以,但是不知为什么就我不行。。。
还有个疑问,如果有N个菜单,
CMenu* pMenu =GetMenu()->GetSubMenu(??????);
?????里面怎么知道要选择哪一个??

[Quote=引用 5 楼 visualeleven 的回复:]

引用 4 楼 n70joey 的回复:
还是不行,这个我也试过,调用:
CMenu* pMenu =GetMenu()->GetSubMenu(1);
后,pMenu的地址为NULL的,不知为什么。。。。

引用 3 楼 visualeleven 的回复:

C/C++ code
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:
void CXXDlg::OnCo……
[/Quote]
Eleven 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 n70joey 的回复:]
还是不行,这个我也试过,调用:
CMenu* pMenu =GetMenu()->GetSubMenu(1);
后,pMenu的地址为NULL的,不知为什么。。。。

引用 3 楼 visualeleven 的回复:

C/C++ code
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:
void CXXDlg::OnContextMenu(CWnd* pWnd, ……
[/Quote]
我不知你代码怎么写的,我这边是可以的,没有问题。。。
n70joey 2010-05-03
  • 打赏
  • 举报
回复
还是不行,这个我也试过,调用:
CMenu* pMenu =GetMenu()->GetSubMenu(1);
后,pMenu的地址为NULL的,不知为什么。。。。
[Quote=引用 3 楼 visualeleven 的回复:]

C/C++ code
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_RIGHT_CLICK);……
[/Quote]
尹成 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]
C/C++ code
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_RIGHT_CLI……
[/Quote]

这个稍加修改就可以了,如下:
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:  
void MyDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
if(pWnd->m_hWnd != this->m_hWnd)
{
CMenu menu; //定义CMenu类对象
menu.LoadMenu(IDR_RIGHT_CLICK); //装入建立好的菜单IDC_POPMENU
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
menu.Detach();
}
}

//选择右键弹出菜单的菜单中设置对话框主菜单中的一个子菜单项无效的消息响应函数
void CXXDlg::OnMenuitem32772()
{
// TODO: Add your command handler code here
CMenu* pMenu =GetMenu()->GetSubMenu(1);
ASSERT(pMenu);
pMenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
pMenu->Detach();
}
许文君 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 n70joey 的回复:]
那如果有多个菜单呢???怎么选择其中一个菜单??例如:
IDR_MAIN_MENU和IDR_RIGHT_CLICK
我只想选择IDR_RIGHT_CLICK菜单,然后把里面一个“打开”,并把它变成灰色,让用户无法按

引用 7 楼 cnzdgs 的回复:

稍稍提一下菜单的概念:一个菜单可以包含多个子菜单,例如主菜单一般含有“文件”、“编辑”、“查看”、“帮助”四个子菜单,GetSub……
[/Quote]
LoadMenu时加载IDR_RIGHT_CLICK
n70joey 2010-05-03
  • 打赏
  • 举报
回复
那如果有多个菜单呢???怎么选择其中一个菜单??例如:
IDR_MAIN_MENU和IDR_RIGHT_CLICK
我只想选择IDR_RIGHT_CLICK菜单,然后把里面一个“打开”,并把它变成灰色,让用户无法按
[Quote=引用 7 楼 cnzdgs 的回复:]

稍稍提一下菜单的概念:一个菜单可以包含多个子菜单,例如主菜单一般含有“文件”、“编辑”、“查看”、“帮助”四个子菜单,GetSubMenu(0)得到的是“文件”菜单,GetSubMenu(1)得到的是“编辑”菜单……
弹出菜单需要给出的是一个子菜单句柄,例如点击鼠标右键时要显示主菜单中的“编辑”菜单,则用GetMenu()->GetSubMenu(1)获取“编辑”菜单的句柄。多数情况下,程序的……
[/Quote]
scream7 2010-05-03
  • 打赏
  • 举报
回复
友情帮顶~~
n70joey 2010-05-03
  • 打赏
  • 举报
回复
void CTestListDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) //
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

CMenu menu;
VERIFY( menu.LoadMenu( IDR_RIGHT_CLICK ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
popup->Detach();
}
*pResult = 0;
}
void CTestListDlg::OnStartDown()
{
CMenu* pMenu =GetMenu()->GetSubMenu(0);
ASSERT(pMenu);
pMenu->EnableMenuItem(ID_START_DOWN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
pMenu->Detach();
}


这是我的代码
cnzdgs 2010-05-03
  • 打赏
  • 举报
回复
稍稍提一下菜单的概念:一个菜单可以包含多个子菜单,例如主菜单一般含有“文件”、“编辑”、“查看”、“帮助”四个子菜单,GetSubMenu(0)得到的是“文件”菜单,GetSubMenu(1)得到的是“编辑”菜单……
弹出菜单需要给出的是一个子菜单句柄,例如点击鼠标右键时要显示主菜单中的“编辑”菜单,则用GetMenu()->GetSubMenu(1)获取“编辑”菜单的句柄。多数情况下,程序的右键菜单不会与主菜单完全相同,通常要另外添加一个菜单资源,可以在该菜单资源中添加多个子菜单,每个子菜单作为一个右键菜单,根据需要显示其中的某一个。GetSubMenu的参数从0开始依次表示每个子菜单。
Eleven 2010-05-02
  • 打赏
  • 举报
回复
// 响应右键弹出菜单,响应WM_CONTEXTMENU消息:
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_RIGHT_CLICK);
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON, point.x, point.y, this);
menu.Detach();
}

//选择右键弹出菜单的菜单中设置对话框主菜单中的一个子菜单项无效的消息响应函数
void CXXDlg::OnMenuitem32772()
{
// TODO: Add your command handler code here
CMenu* pMenu =GetMenu()->GetSubMenu(1);
ASSERT(pMenu);
pMenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
pMenu->Detach();
}
wuhuwy 2010-05-02
  • 打赏
  • 举报
回复
友情帮顶
向立天 2010-05-02
  • 打赏
  • 举报
回复
你怎么在网上查的我不知道
不过你要调用IDR_RIGHT_CLICK为弹出菜单可以参考以下代码
CMenu menu;
menu.LoadMenu(IDR_RIGHT_CLICK);
CMenu* pPopup = menu.GetSubMenu(0);
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON, point.x, point.y, this);
pPopup->DestroyMenu();

16,472

社区成员

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

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

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