动态添加菜单:是在原有的菜单栏中用程序添加子菜单,而不是可视化操作;
在mainframe里面的oncreate函数里面;
★注意:在resource.h中添加资源ID定义
#define IDM_HELLO 111
创建资源ID,只是为了后面添加菜单命令响应函数;
算法:
//S1:创建一个空的弹出菜单;
CMenu menu;
menu.CreatePopupMenu();
//S2:获取菜单栏的指针;
GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");
//S3:插入一个子菜单,仅作演示,可以没有
GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"WinSun");
//S4:添加子菜单项,IDM_HELLO,是一个resource.h里面的宏定义符号常量111
menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");
menu.AppendMenu(MF_STRING,112,"Weixin");
menu.AppendMenu(MF_STRING,113,"Mybole");
//S5:脱离资源和指针
menu.Detach();
完整程序如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//S1:创建一个空的弹出菜单;
CMenu menu;
menu.CreatePopupMenu();
//S2:获取菜单栏的指针;
GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");
//S3:插入一个子菜单,仅作演示,可以没有
GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"WinSun");
//S4:添加子菜单项,IDM_HELLO,是一个resource.h里面的宏定义符号常量111
menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");
menu.AppendMenu(MF_STRING,112,"Weixin");
menu.AppendMenu(MF_STRING,113,"Mybole");
//S5:脱离资源和指针
menu.Detach();
return 0;
}
添加/删除系统菜单
给系统菜单添加/删除菜单项
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Welcome");
GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND | MF_STRING,115,"维新");
GetMenu()->DeleteMenu(1,MF_BYPOSITION);
GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);*/
GetMenu()->DeleteMenu( GetMenu()->GetSubMenu(1)->GetMenuItemID(0),MF_BYC
OMMAND);
如何添加响应函数
★注意:因为是程序代码添加菜单,我们无法可视化看到菜单,就无法使用classwizard添加响应函数,只能手动添加:三个步骤;
第一步:在MainFrm.h中声明消息响应。DECLARE_MESSAGE_MAP()之前添加
afx_msg void OnHello();
第二步:在MainFrm.cpp中END_MESSAGE_MAP()之前,添加
ON_COMMAND(IDM_HELLO,OnHello)
第三步:在MainFrm.cpp中添加CMainFrame::OnHello()函数定义
void CMainFrame::OnHello()
{
MessageBox("hello");
}