关于VC++下动态添加菜单的心得

 

孙鑫的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()

 

你可能感兴趣的:(VC/SDK/MFC)