孙鑫的VC++ 中有一段代码是在CMainFrame的OnCreate函数中动态添加菜单以及菜单项
代码如下
CMenu menu;
menu.CreateMenu();
GetMenu()->InsertMenu(0,MF_POPUP|MF_BYPOSITION,(UINT)menu.m_hMenu,"Test");
menu.AppendMenu(MF_STRING,111,"Hello");
menu.AppendMenu(MF_STRING,112,"Bye");
menu.Detach();
我一直疑惑为什么menu.AppendMenu()调用,就会在Test子菜单下添加菜单项
为什么 menu.AppendMenu() 添加的不是一个子菜单
今天终于知道了
GetMenu() 获得了框架主菜单的指针,然后紧接着调用InsertMenu(),这就是说
明要在主菜单上添加子菜单了,当然这个子菜单不一定要具有MF_POPUP样式
关键的一点是,InsertMenu将这个要添加的子菜单的ID设为了(UINT)menu.m_hMenu
这就导致了我们刚刚创建的菜单对象menu
和我们用InsertMenu 插入的子菜单关联起来了
所以说,这个menu菜单项现在就成了主菜单的子菜单了
所以,我们调用 menu.AppendMenu() 的时候,实际就是再向menu子菜单添加菜单项了
我们可以将上面的第三行代码修改为
GetMenu()->GetSubMenu()->InsertMenu(0,MF_POPUP|MF_BYPOSITION,(UINT)menu.m_hMenu,"Test");
这时候,menu 就不再是主菜单的子菜单,而是索引为0的子菜单的菜单项
只不过,这个菜单项仍旧是一个弹出式菜单
然后接下来的
menu.AppendMenu() 实际就是想这个弹出式菜单项再添加菜单项了
我们可以将上面代码中 MF_POPUP 的样式去掉,我们会发现这时编译并不会出错
但是运行时可以看到,Test菜单项并不弹出Hello 和 Bye 两个子菜单项
关于创建菜单的两个函数 CreateMenu() 和CreatePopupMenu()并没有什么本质的区别
调用CreateMenu() 的时候 传入MF_POPUP 样式就成了CreatePopupMenu()