6.4
对菜单的动态操作,包括:1、针对弹出菜单的动态操作
2、针对菜单项的动态操作
6.4.1 添加菜单项目
函数:BOOL AppendMenu(UNIT nFlags, UNIT_PTR nIDNewItem =0, LPCTSTR lpszNewItem=NULL);
参数:nFlags:指定新添加的菜单项目的状态信息;
nIDNewItem:取值决定于第一个参数;
1、如果第一个参数是MF_POPUP,那么nIDNewItem为顶层菜单句柄;
2、否则是所要添加的新菜单项的命令ID。
lpszNewItem:取值同样取决于第一个参数
1、第一个参数是MF_STRING,则lpszNewItem就是指向要添加的这个新菜单项目的文本的指针。
2、第一个参数是MF_OWNERDRAW,则lpszNewItem就是指向该菜单项目的一个附加数据指针。
3、第一个参数是MF_SEPARATOR,则lpszNewItem的值将被忽略。
6.4.2 插入菜单项目
函数:BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL);
参数:nPositon :指定新菜单项目的插入位置,采参数2利用或运算与MF_BYCOMMAND或MF_BYPOSITION标志组合,为MF_BYCOMMAND标志时,第一个参数是一个菜单的命令标识,为MF_BYPOSITION标志时,那么新菜单项目将在第一个参数指定的位置所表示的菜单项目之前插入。
nFlags:指定新添加的菜单项目的状态信息;
nIDNewItem:取值决定于第一个参数;
1、如果第一个参数是MF_POPUP,那么nIDNewItem为顶层菜单句柄;
2、否则是所要添加的新菜单项的命令ID。
lpszNewItem:取值同样取决于第一个参数
1、第一个参数是MF_STRING,则lpszNewItem就是指向要添加的这个新菜单项目的文本的指针。
2、第一个参数是MF_OWNERDRAW,则lpszNewItem就是指向该菜单项目的一个附加数据指针。
3、第一个参数是MF_SEPARATOR,则lpszNewItem的值将被忽略。
6.4.3删除菜单
函数:BOOL DeleteMenu(UINT nPosition, UINT nFlags)
6.4.4动态添加的菜单的命令响应
Step1:在Resource.h中定义资源ID
Step2:1、在响应这个菜单的程序类的头文件中添加响应这个函数的原型
afx_msg void OnHello();
DECLARE_MESSAGE_MAP()
2、在响应这个菜单项命令的程序类的源文件中的消息映射表中添加消息映射。位置:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
.....
ON_COMMAND(IDM_HELLO, OnHello)
END_MESSAGE_MAP()
3、实现菜单命令消息响应函数的定义体
代码:
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("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CMenu menu;
menu.CreateMenu();
GetMenu()->InsertMenuW(2, MF_POPUP | MF_BYPOSITION, (UINT)menu.m_hMenu, _T("TEST"));
menu.AppendMenu(MF_STRING, 111, _T("hello"));
menu.AppendMenu(MF_STRING, 112, _T("bye"));
menu.AppendMenu(MF_STRING, 113, _T("mybole"));
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING, 114, _T("Welcome"));
GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING, 115, _T("VC 编程"));
menu.Detach();
return 0;
}