一: 根据程序运行时候的条件,动态改变菜单
效果图:

(当安钮为“允许计算”)

(当安钮为“禁止计算”)
二:实现步骤
为了更好的说明,现编写一个能实现四个数相加,和计算它们的平均数的小程序来说明。
1:先在vc 的MFC AppWizard(exe)中建立一个对话框应用程序,其他均为缺省的
2:点vc菜单“插入”-》资源 建立一个菜单,最后如图:

3:由于是动态生成的菜单选项,所以我们要实现它的功能就不能在Class Wizard中映射它的函数了,但不要怕,很简单的2步,
a:打开你工程中的Resource.h在里面加入你要生成的菜单的ID,如:
#define IDM_SUM 32772 //手动加入的菜单IDM_SUM
#define IDM_AVERAGE 32773 //手动加入的菜单IDM_AVERAGE
b:在BEGIN_MESSAGE_MAP(CMenuOfDlgDlg, CDialog)中加入它的消息映射
ON_COMMAND(IDM_SUM, OnSum) //手工加入IDM_SUM到函数OnSum的映射
ON_COMMAND(IDM_AVERAGE, OnAverage) //手工加入IDM_AVERAGE到函数OnAverage的映射
4:在需要的时候生成菜单
//////////////动态生成子菜单功能实现////////////////
void CMenuOfDlgDlg::OnAllow()
{
// TODO: Add your control notification handler code here
if(!bAllow)
{
CMenu *pmenu=GetMenu();
CMenu *pSubmenu=pmenu->GetSubMenu(0);
pSubmenu->InsertMenu(0,MF_BYPOSITION,IDM_SUM,"求和");
pSubmenu->InsertMenu(1,MF_BYPOSITION,IDM_AVERAGE,"求平均");
//pSubmenu->InsertMenu(NULL,MF_BYCOMMAND+1,NULL,"帮助");
bAllow=TRUE;
m_Allow.SetWindowText("禁止计算");
}
else
{
CMenu *pmenu=GetMenu();
CMenu *pSubmenu=pmenu->GetSubMenu(0);
pSubmenu->DeleteMenu(IDM_SUM,MF_BYCOMMAND);
pSubmenu->DeleteMenu(IDM_AVERAGE,MF_BYCOMMAND);
bAllow=FALSE;
m_Allow.SetWindowText("允许计算");
}
}
就这样一个动态菜单就生成了
CMenu类方法:
AppendMenu
把一个新选项加到给定的菜单末端
CheckMenuItem()
在弹出菜单中,把一个效验标记放到下一个菜单项或从一个菜单项中取消一个效验标记
CheckMenuRadioItem()
在此组中,把一个单选按钮放到菜单项傍边或从全部其他菜单选项里取消一个已经存在的单选按钮
EnableMenuItem()
激活菜单项或禁用菜单项并使其变灰
GetMenuContextHelpId()
检索与菜单结合的帮助上下文ID
GetMenuItemId()
在弹出式菜单或顶层菜单中获得菜单项标识符
GetMenuState()
获得指定菜单项的状态或弹出菜单中的菜单项成员
GetMenuString()
获得指定菜单项的标记
GetSubMenu()
获得指向弹出菜单的指针
InsertMenu()
在指定位置插入新的菜单项能把其他的选项向下移
ModifyMenu()
在指定位置改变已存在的菜单项
RemoveMenu()
从指定菜单删除与弹出菜单结合的菜单项
SetMenuContextHelpId()
设置与菜单有关的帮助上下文ID
SetMenuItemBitmaps()
与菜单项有关的指定效验标记位图
(西南交通大学峨眉校区01级3班 李建超)