一个单文档MFC程序,想要在程序中手工修改框架菜单,在CMainFrame::OnCreate中加入如下语句:
-------------------------------------------------------------------
// Create a new menu for the application window.
CMenu mainMenu1;
mainMenu1.CreateMenu();
CMenu popupMenu;
popupMenu.CreatePopupMenu();
popupMenu.AppendMenu(MF_STRING, ID_APP_EXIT, (LPCTSTR)"E&xit");
mainMenu1.AppendMenu(MF_POPUP, (UINT)opupMenu.m_hMenu, "&File"); popupMenu.Detach();// Remove and destroy old menu
SetMenu(NULL);
CMenu* old_menu = CMenu::FromHandle(m_hMenuDefault);
// old_menu->DestroyMenu(); //***为什么有此句就出错// Add new menu.
SetMenu(&mainMenu1);
// Assign default menu
m_hMenuDefault = mainMenu1.m_hMenu;         mainMenu1.Detach();//该句可要可不要?--------------------------------------------------------------------
我的问题是:
1)上面这种方法创建新菜单对吗?
2)为什么有old_menu->DestroyMenu();主这名就出错,难道不用消毁旧菜单吗,可MSDN中却说SetMenu will not destroy a previous menu. An application should call the CMenu::DestroyMenu member function to accomplish this task.
3)在什么情况下要调用Detach(),上面最后一句为什么可要可不要?

解决方案 »

  1.   

    我也刚学习菜单,一点看法仅供参考:1)MSND上不是说:SetMenu的作用是Sets the "current menu" to the "specified menu". Causes the window to be "redrawn "to reflect the menu change. 也就是说它不是销毁当前菜单,而是重画菜单的改变部分。只有当程序结束时,系统会自动调用DestroyMenu销毁菜单。因此不用我们调用DestroyMenu去销毁菜单。
    2)Detach函数从CMenu对象中释放菜单句柄,这样可以防止CMenu在移出作用域时新菜单被破坏,
         通过CMenu mainMenu1;
    mainMenu1.CreateMenu();
             SetMenu(&mainMenu1);
    完成了对菜单重新设置,用不用mainMenu1.Detach();都可以。而
             CMenu popupMenu;
    popupMenu.CreatePopupMenu();
    popupMenu.AppendMenu(MF_STRING, ID_APP_EXIT, (LPCTSTR)"E&xit");
    mainMenu1.AppendMenu(MF_POPUP, (UINT)opupMenu.m_hMenu, "&File");
    必须有:
    popupMenu.Detach();
    至于为什么我也说不清。