备忘: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);
if(menuID > 10000)
{
//添加你自己的处理代码
}
}
如果是使用对话框的mfc,自己重载OnCommand函数即可