常用菜单操作函数
文中涉及到的VC++中常见的菜单只要操作如下:
GetMenu() - 获得与框架窗口相链接的菜单。
InsertMenu() – 在指定位置插入新的菜单项,其他的选项向下移。
GetSubMenu() – 获得子菜单指针。
GetMenuItemCount() – 得到菜单下的菜单项的个数。
AppendMenu() – 添加一个新菜单。
GetMenuString() – 获得指定菜单项的标记。
DeleteMenu() – 删除菜单。
1.0 静态创建菜单 (静态创建菜单要求先插入菜单资源,从得到资源ID IDR_MENU2
CMenu menu;
CMenu *pSubMenu;
menu.LoadMenu(IDR_MENU2);
pSubMenu = menu.GetSubMenu(0);
CPoint point1;
GetCursorPos(&point1);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point1.x, point1.y, this);
pSubMenu->DestroyMenu();
menu.DestroyMenu();
2.0 动态创建菜单
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();
// TODO: Add your control notification handler code here
char buf[2];
//获取顶级菜单
CMenu* pMenu=GetMenu();
//获取1级菜单
CMenu* pFileMenu=pMenu->GetSubMenu(0);
CMenu* pTestMenu=pMenu->GetSubMenu(1);
//添加2级菜单
if(pTestMenu->GetSafeHmenu()==NULL)
return;
//添加一个2级弹出菜单,将"文件"菜单项作为该菜单的子菜单
pTestMenu->AppendMenu(MF_POPUP,(UINT)pFileMenu->m_hMenu,"文件");
//添加一个2级弹出菜单,该菜单的子菜单为空
pTestMenu->AppendMenu(MF_POPUP,(UINT)pTestMenu->m_hMenu,"测试");
//添加10个2级普通菜单
for(UINT m_ID=1;m_ID<=10;m_ID++)
{
itoa(m_ID,buf,10);
pTestMenu->AppendMenu(MF_SEPARATOR);
pTestMenu->AppendMenu(
MF_STRING,m_ID+ID_TESTMENU,"2级菜单"+CString(buf));
}
//添加n级菜单
CMenu* pnMenu=pTestMenu->GetSubMenu(2);
pnMenu->AppendMenu(MF_POPUP,(UINT)pnMenu->m_hMenu,"3级菜单");
for(int i=0;i<5;i++)
{
pnMenu=pnMenu->GetSubMenu(0);
if(pnMenu==NULL) return;
itoa(i+4,buf,10);
pnMenu->AppendMenu(
MF_POPUP,(UINT)pnMenu->m_hMenu,buf + CString("级菜单"));
}
pnMenu->GetSubMenu(0)->AppendMenu(
MF_STRING,ID_TESTMENU,"9级菜单");