如何在程序运行时动态创建菜单并添加处理事件,并能不能与某个类中的一个函数关联起来
(通过预先定义菜单资源或不通过预先定义菜单资源)?在程序运行时如何实现像在VC中添加外部工具并在添加一菜单项,当点击这菜单项就运行这一程序?

解决方案 »

  1.   

    我的处理方法如下:
    1、在资源(Resource.h)中定义一系列数字相连的ID。如第一个ID为ID_MENU0,数值为8000,最后一个为ID_MENU20,数值为8020;2、在你需要动态添加菜单的函数中,增加如下语句以增加菜单项:
    CMenu *pMenu = pMainFrame->GetMenu();
    pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex是你要添加菜单项放在主菜单的哪个子菜单下,当然,放到其他菜单下也可以,看自己怎么处理;
    pMenu->AppendMenu(MF_STRING, ID_MENU0 + iIndex, "相应菜单项显示名称");
    pMenu->Detach();3、在CMainFrame类的.h文件的消息定义块(//{{AFX_MSG(CMainFrame))的“外面”定义一个菜单范围消息响应函数,如:
    afx_msg void OnDealWithMenus();4、在CMainFrame类的.cpp文件的消息映射块(//{{AFX_MSG_MAP(CMainFrame))的“外面”(END_MESSAGE_MAP()语句之前)将前面多定义的所有ID都映射到前面定义的函数中:
    ON_COMMAND_RANGE(ID_MENU0, ID_MENU20, OnDealWithMenus)5、增加CMainFrame类的消息WM_MENUSELECT响应函数OnMenuSelect(),并添加如下语句:
    void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) 
    {
    // TODO: Add your message handler code here
    if((nFlags | MF_MOUSESELECT) == nFlags && nFlags != 65535)
    m_lCurSelMenuID = nItemID;//获取被单击菜单的ID号;m_lCurSelMenuID是一个类成员long型变量;

    CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
    }
    这样就获取了当前被选择的菜单的ID号,便于后续处理;6、手动在CMainFrame类的.cpp函数中增加OnDealWithMenus()函数的函数体:
    void CMainFrame::OnDealWithMenus() 
    {
    //当系列菜单被单击时,都响应这个函数,获取被单击的菜单项的名称,然后处理;
    CMenu *pMenu = GetMenu();
    pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex和前面添加处对应;
    CString sClickMenuItemName;
    pMenu->GetMenuString(m_lCurSelMenuID, sClickMenuItemName, MF_BYCOMMAND);//sClickMenuItemName是当前选择菜单的名称;
    pMenu->Detach();//有了菜单项名称,就可以在这里做对应的处理了;
    }看上去比较复杂,但是如果比较熟悉MFC编程,还是比较容易的。这种方法比较灵活,基本上能够处理任何动态添加的菜单和消息处理,如果你觉得合适,能解决你的问题的话,建议提交成FAQ,以便更多人使用
      

  2.   

    先什么都弄好,不显示。到显示的时候用
    SetMenu()