要把自绘制菜单映射到FrameWnd上。

解决方案 »

  1.   

    对应函数指的是不是我的与各菜单项对应的函数?我并没有写任何与之对应的函数。Exit项的操作是系统默认的。
      

  2.   

    我的ReMapMenu代码如下:
    void CMyMenu::ReMapMenu(CMenu *pMenu)
    {
      CMyMenuData * m_pMenuData;
      CMenu *m_SubMenu;
      int m_MenuCount;  m_MenuCount = pMenu->GetMenuItemCount();  for(int i = m_MenuCount -1 ; i >= 0 ; i --)
     {
        if((m_SubMenu = pMenu->GetSubMenu(i)) != NULL)
            ReMapMenu(m_SubMenu);
        m_pMenuData = new CMyMenuData;
        if(pMenu->GetMenuItemID(i) == 0) // is a separater
        {
           m_pMenuData->m_IsSeparator = TRUE;
           m_pMenuData->m_Icon = 0;
        }
        else
        {
           m_pMenuData->m_Icon = 0;
           m_pMenuData->m_IsSeparator = FALSE;   
           pMenu->GetMenuString(i,m_pMenuData->m_MenuTitle,MF_BYPOSITION);
        }
        m_MenuArray.Add(m_pMenuData);
        if(!pMenu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION,0,(char *)m_pMenuData))
        {
           AfxMessageBox("ModifyMenu Error!");
           return;
        }
      }
    }我在mainframe中定义了CMyMenu m_Menu  ;
    然后在OnCreate中加了:CMenu *m_TempMenu = GetMenu();
    m_Menu.RemapMenu(m_TempMenu);运行后就出现了菜单无消息响应的情况。为了简化说明,我的drawitem和measureitem函数如下:
    void CMyMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    {
      lpMeasureItemStruct->itemHeight = 16;
      lpMeasureItemStruct->itemWidth = 70;
    }void CMyMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        CMyMenuData *m_MenuData = (CMyMenuData *)lpDrawItemStruct->itemData; 
        CDC *m_DC = CDC::FromHandle(lpDrawItemStruct->hDC);     m_DC->DrawText(m_MenuData->m_MenuTitle,
                        &lpDrawItemStruct->rcItem,DT_CENTER|DT_BOTTOM);
    }MainFrame中的上述两个函数为:
    void CMainFrame::OnMeasureItem(int nIDCtl, 
                                   LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    {
      if(lpMeasureItemStruct->CtlType == ODT_MENU)
        m_Menu.MeasureItem(lpMeasureItemStruct);
      else
        CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
    }void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
      if(lpDrawItemStruct->CtlType == ODT_MENU)
         m_Menu.DrawItem(lpDrawItemStruct);
      else
         CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
      

  3.   

    你的 ModifyMenu 那一句的第三個參數傳了0, 改成 pMenu->GetMenuItemID(i) 試一試, 總之是不要修改 Menu Item 的 ID.