文章目录
一、新建MFC对话框项目
二、添加菜单资源
添加一个主菜单和3个子菜单。
三个子菜单的ID分别为:
三、添加右键响应函数
3.1 方法1:WM_CONTEXTMENU响应函数
在类视图中为对话框添加消息WM_CONTEXTMENU的响应函数。
在响应函数中添加代码,加载指定的菜单:
void CAddRightButtonMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
//从资源文件中加载指定ID的菜单
CMenu menu;
menu.LoadMenu(IDR_MENU1);
//获得指定ID菜单的所有子菜单
CMenu* pMenu;
pMenu = menu.GetSubMenu(0);
//EnableMenuItem的意思是允许、禁止或变灰指定的菜单条目。
//为每一个子菜单设置状态
pMenu->EnableMenuItem(ID_32771, MF_BYCOMMAND | MF_ENABLED);//激活转态
pMenu->EnableMenuItem(ID_32772, MF_BYCOMMAND | MF_ENABLED);//激活转态
pMenu->EnableMenuItem(ID_32773, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);//禁用状态,灰色
//在鼠标点击处的位置加载出来菜单项
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
pMenu->Detach();
menu.DestroyMenu();
}
3.2 方法2:WM_RButtonDown响应函数
在类视图中为对话框添加消息WM_RButtonDown的响应函数。
void CAddRightButtonMenuDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0);
CPoint pointPos;
GetCursorPos(&pointPos);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pointPos.x, pointPos.y, this);
CDialogEx::OnRButtonDown(nFlags, pointPos);
}
以上两种方式任选一种即可。
四、添加菜单响应函数
为每一个子菜单添加菜单响应函数:
在生成的代码中添加响应的动作:
void CAddRightButtonMenuDlg::On32771()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"Hello,WaitFoF");
}
void CAddRightButtonMenuDlg::On32772()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"Hi,WaitFoF");
}
void CAddRightButtonMenuDlg::On32773()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"I want to eat a apple.");
}
五、测试
六、升级版
为子菜单Hello添加3个子菜单:
为子菜单Hi添加一个子菜单:How old are you?
为子菜单Apple添加2个子菜单:big和small
为每一个菜单添加响应函数:
添加响应内容:
void CAddRightButtonMenuDlg::OnHelloWaitfof()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"Hello Waitfof.");
}
void CAddRightButtonMenuDlg::OnHelloTom()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"Hello Tom.");
}
void CAddRightButtonMenuDlg::OnHelloSalay()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"Hello Salay.");
}
void CAddRightButtonMenuDlg::OnHiH()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"怎么老是你?");
}
void CAddRightButtonMenuDlg::OnAppleBig()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"大苹果");
}
void CAddRightButtonMenuDlg::OnAppleSmall()
{
// TODO: 在此添加命令处理程序代码
MessageBox(L"小苹果");
}
此时的右键右键响应函数选择的是WM_RBUTTONDOWN。
若屏蔽WM_RBUTTONDOWN,选择WM_CONTEXTMENU:
你会发现效果相同,设置的Apple禁用无效。