函数功能:该函数分配一个新菜单到指定窗口。
函数原型:BOOL SetMenu(HWND hWnd,HMENU hMenu);
参数:
hWnd:菜单被分配到其中的窗口的句柄。
HMenu:新菜单的句柄。如果菜单参数为NULL,则窗口的当前菜单被删除。
返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLaSError函数。
备注:窗口被重画来反映菜单的修改。函数SetMenu替换原来的菜单(如果存在),但并不将其销毁。应用程序必须调用函数DestroyMenu来销毁菜单。
一个单文档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)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();
至于为什么我也说不清。