SetMenu和LoadMenu函数学习

来源:互联网 发布:80端口是否打开 编辑:程序博客网 时间:2024/06/02 19:24

函数功能:该函数分配一个新菜单到指定窗口。

    函数原型: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();  
  至于为什么我也说不清。

原创粉丝点击