1 h文件定义.
afx_msg void OnPopup1();
afx_msg void OnPopup2();
afx_msg void OnPopup3();
2 cpp 定义
ON_COMMAND(1001, OnPopup1)
ON_COMMAND(1002, OnPopup2)
ON_COMMAND(1003, OnPopup3)
3 cpp 响应函数的实现
void CFVR_GeoNodeTreeCtrl::OnPopup1()
{
AfxMessageBox(L"111");
}
void CFVR_GeoNodeTreeCtrl::OnPopup2()
{
AfxMessageBox(L"222");
}
void CFVR_GeoNodeTreeCtrl::OnPopup3()
{
AfxMessageBox(L"333");
}
以下转贴(有改动)
------------------------------------------------------------------------------------
MFC中利用CMenu类动态添加弹出菜单和响应函数
步骤:
1 声明一个菜单:
CMenu menu;
2 生成菜单对象:
menu.CreatePopupMenu();
3 给菜单添加上内容:
menu.AppendMenu(MF_STRING,WM_CLEARHOSTS,"清除HOSTS");
AppendMenu函数具体的意义可以查看MSDN,其中WM_CLEARHOSTS为自定义的一个消息,最后一个参数为菜单的text,点击这个菜单就可以调用WM_CLEARHOSTS消息的处理函数。
4 添加子弹出菜单:
CMenu submenu;
submenu.CreatePopupMenu();
menu.AppendMenu(MF_POPUP,(UINT_PTR)(submenu.m_hMenu),"sub");
5 设置当失去焦点时菜单自动消失
SetForegroundWindow();
6 设置菜单的位置:
menu.TrackPopupMenu();
以上各步连接起来就是一个完整的动态生成菜单的步骤,当动态生成的菜单很多且菜单又不固定的时候,预先
为每个菜单都定义一个消息和消息处理函数是很麻烦且不现实的,现在介绍一种方法来动态响应动态生成的菜单。
其原理就是利用OnCommand函数。
首先,要为每一个动态生成的菜单指定一个ID,方式如下
menu.AppendMenu(MF_STRING,ID,"yourMenuName");
其中参数ID为一个唯一的整数,可以由你自己指定,当鼠标单击此菜单的时候,系统发送一个消息,此消息优先
被OnCommand函数接收,OnCommand函数的原形为:
BOOL OnCommand(WPARAM wParam, LPARAM lParam);
假如你指定菜单的ID为10001,响应函数的具体写法为:
BOOL OnCommand(WPARAM wParam, LPARAM lParam)
{
int menuID = LOWORD(wParam);
switch(menuID)
{
case 1001:
AfxMessageBox(L"111");
break;
case 1002:
AfxMessageBox(L"222");
break;
case 1003:
AfxMessageBox(L"333");
break;
case 1004:
AfxMessageBox(L"444");
break;
default:
break;
}
return true;
}
如果是使用对话框的mfc,自己重载OnCommand函数即可
vc动态添加弹出菜单和响应函数
最新推荐文章于 2022-04-27 10:16:01 发布