弹出式菜单其实也是一种菜单,只不过每一个菜单子项是弹出式的。
制作过程
1 新建一个对话框。
2 添加菜单资源 资源ID: IDR_MENU1 菜单以弹出式显示(view as popup)
3 响应鼠标右击或者响应WM_CONTEXTMENU消息
void CDemo5Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu * popup= menu.GetSubMenu(0); //0是指IDR_MENU1中第0列菜单。可以随便取一项菜单,编号0~n
popup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
}
或者自主添加菜单项
///自己创建菜单项
void CDemo5Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menuPopup;
if(menuPopup.CreatePopupMenu())
{
menuPopup.AppendMenu(MF_STRING,ID_FILE_SAVE,"保存文件/tCtrl+S");
menuPopup.AppendMenu(MF_STRING,ID_FILE_PRINT,"打印文件/tCtrl+P");
menuPopup.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
}
}
4 响应弹出式菜单
在.h文件中添加
afx_msg void OnPopup1();
afx_msg void OnPopup2();
afx_msg void OnPopup3();
在cpp文件中添加消息映射
ON_COMMAND(ID_SUBMENU1, OnPopup1) //菜单1 ID
ON_COMMAND(ID_SUBMENU2, OnPopup2) //菜单2 ID
ON_COMMAND(ID_SUBMENU3, OnPopup3)
编写函数
void CDemo5Dlg::OnPopup1()
{
MessageBox("你点击了菜单1");
}
void CDemo5Dlg::OnPopup2()
{
MessageBox("你点击了菜单2");
}
void CDemo5Dlg::OnPopup3()
{
MessageBox("你点击了菜单3");
}
也可以直接重写ONCommand函数
BOOL CDemo5Dlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
int menuID = LOWORD(wParam);
switch(menuID)
{
case ID_SUBMENU1:
AfxMessageBox("111");
break;
case ID_SUBMENU2:
AfxMessageBox("222");
break;
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}