none
vc2008中使用CMFCMenuBar如何动态改变菜单文本 RRS feed

  • 问题

  • 在vc2008中使用CMFCMenuBar时

    子菜单因为有唯一的ID,可以使用如下方式来动态改变文本

    void CMainFrame::OnUpdateFileOpen(CCmdUI *pCmdUI)
    { pCmdUI->SetText(_T("Open")); }

    而父菜单没有ID,我使用如下方式更改父菜单文本

     CMFCToolBarButton* pFileMenu = m_wndMenuBar.GetMenuItem(0);
      pFileMenu->m_strText = _T("&文件");  

    可能由于使能了Customize导致父菜单文本总是无法正确更新,大家有别的方法吗?

     


    qiuyong
    2011年6月10日 8:50

答案

  • 谢谢,问题终于解决了。

    原因是:我是在OnCreate函数最后更新菜单文本

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
      return -1;

    。。。。

     CMFCToolBarMenuButton* pFileMenu = (CMFCToolBarMenuButton*)m_wndMenuBar.GetButton(nFilePos);
      pFileMenu->m_strText = _T("&F文件"));

    }

    当CMainFrame::OnCreate完毕后,系统会调用CWinAppEx::LoadState,在CWinAppEx::LoadState里面又会把菜单文本改成注册表中记录的名字,

    所以菜单文本总是改变不了。

    知道问题原因就好解决了,在CTestApp::LoadCustomState还是中更改菜单文本就可以,

    void CTestApp::LoadCustomState()
    {
     
          InitMenuText();//自定义的更改菜单文本的函数
     
    }

     


    新东西的bug总是比旧的多
    • 已标记为答案 qydc 2011年6月17日 3:28
    2011年6月17日 3:26

全部回复

  • 你好,

     

    你可以考虑用遍历一下菜单,用GetSubMenu函数,获取各个菜单的名称,如果等于摇需要修改的,再调用ModifyMenu函数修改该菜单项

    这个是参考代码:

    CMenu*   pSubMenu   =   pMenu-> GetSubMenu(0);

    if(pSubMenu)

    {

    BOOL   ret   =   pSubMenu-> ModifyMenu(ID_MAIN_START,   MF_STRING ¦MF_BYPOSITION,   ID_MAIN_START,   _T("停止"));

     

    DrawMenuBar();    }

     

    希望我的建议能够帮助您解决您的问题


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月14日 9:12
  • Rob Pan:

            您好!谢谢回复

             我用的是CMFCMenuBar,不是CMenu。

             我的程序在vc6下是使用CMenu菜单的ModifyMenu来更改菜单文本,现在换成vc2008使用CMFCMenuBar,CMFCMenuBar的子菜单是CMFCToolBarButton,CMFCToolBarButton没有ModifyMenu。


    新东西的bug总是比旧的多
    2011年6月15日 6:15
  • 你好,

     

    您可以尝试转换成CMenu指针。

    CMFCMenuBar m_wndMenuBar;
    CMenu *mainMenu = CMenu::FromHandle(m_wndMenuBar.GetDefaultMenu());

    需要注意的是,您对mainMenu进行完您想要的操作后,需要调用m_wndMenuBar.CreateFromMenu(mainMenu->GetSafeHmenu, TRUE, TRUE);来将变化反映到m_wndMenuBar里面去。

     

    此外,这些是第三方网站,对于CMFCMenuBar加载菜单的一些讨论,也许对您的问题有所帮助。

    1. http://topic.csdn.net/u/20110311/08/c31cba01-5fdd-4dfb-ab3e-c3d4062491d8.html

    2. http://blog.csdn.net/pcliuguangtao/archive/2010/10/30/5976330.aspx

     

    This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月15日 8:01
  • 谢谢,问题终于解决了。

    原因是:我是在OnCreate函数最后更新菜单文本

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
      return -1;

    。。。。

     CMFCToolBarMenuButton* pFileMenu = (CMFCToolBarMenuButton*)m_wndMenuBar.GetButton(nFilePos);
      pFileMenu->m_strText = _T("&F文件"));

    }

    当CMainFrame::OnCreate完毕后,系统会调用CWinAppEx::LoadState,在CWinAppEx::LoadState里面又会把菜单文本改成注册表中记录的名字,

    所以菜单文本总是改变不了。

    知道问题原因就好解决了,在CTestApp::LoadCustomState还是中更改菜单文本就可以,

    void CTestApp::LoadCustomState()
    {
     
          InitMenuText();//自定义的更改菜单文本的函数
     
    }

     


    新东西的bug总是比旧的多
    • 已标记为答案 qydc 2011年6月17日 3:28
    2011年6月17日 3:26