我想在我的 SDI 窗体菜单中动态增加子菜单项,用如下方法:
pDriveMenu->AppendMenu(MF_STRING | MF_ENABLED, IDList[index], name);但是加上的菜单项都是灰色的,对这些菜单项的处理方法是参考 MSDN 里面的,也就是重载 OnCmdMsg,但怎么才能使它可用呢?

解决方案 »

  1.   

    需要事先添加相应的消息处理函数,而且你的ID号最好是连续的
    举例:
    UINT IDList[5] = {0};//五个子菜单项for(int i = 0;i < 5;i++)
        IDList[i] = 32771 + i;//即IDList 的内容为32771 - 32775在窗口的MessageMap 的//}}AFX_MSG_MAP 后边添加宏:
    ON_COMMAND_RANGE(32771,32775, OnCtrlMenu)
    ON_UPDATE_COMMAND_UI_RANGE(32771,32775, OnUpdateCtrlMenu)//如果需要动态使能的话

    添加消息处理函数原型:
    afx_msg void OnCtrlMenu(UINT nID);
    afx_msg void OnUpdateCtrlMenu(CCmdUI* pCmdUI);
    在函数体中如此处理:
    void CYourAppView::OnCtrlMenu(UINT nID)
    {
        switch(nID)
        {
        case 32771:
            //to do your code here as:
            AfxMessageBox("this is test menu 32771 !");
            break;
        //other menu id case
        default:
            break;
        }
    }
    void CYourAppView::OnUpdateCtrlMenu(CCmdUI* pCmdUI)
    {
        switch(pCmdUI->m_nID)
        {
        case 32771:
            //to do your code here as:
            pCmdUI->Enable(true);//false to grey menu
            break;
        //other menu id case
        default:
            break;
        }
    }
      

  2.   

    //deal with WindowProc callback function,like this example:
    LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    switch( message )
    {
    case WM_COMMAND:
    switch ( LOWORD( wParam ) )
    {

    case ID_EXIT:
                                          ...
    break;
                                }
              }
    }