回 帖 发 新 帖 刷新版面

主题:[讨论]我有个问题大家帮我解决下,本人刚刚学MFC

1.建一个单文档应用程序BmpMenu   
  2.将BCMenu.cpp和BCMenu.h加到工程中   
  3.在CMainFrame的头文件中定义一个BMenu的对象(别忘了包含头文件BCMenu.h)   
  BCMenu   m_menu;   [em18][em18][em18][em18][em18]
  4.在CMainFrame中加了一个生成图标菜单的函数NewMenu,其定义如下:   
  HMenu   CMainFrame::NewMenu()   
  {   
  m_menu.LoadMenu(IDR_MAINFRAME);   
  //将图标加到文件中   
  m_menu.ModifyODMenuA(NULL,ID_FILE_NEW,IDB_FILE_NEW);   
  m_menu.ModifyODMenuA(NULL,ID_FILE_OPEN,IDB_FILE_OPEN);   
  m_menu.ModifyODMenuA(NULL,ID_FILE_SAVE,IDB_FILE_SAVE);   
  m_menu.ModifyODMenuA(NULL,ID_FILE_PRINT,IDB_FILE_PRINT);   
  //返回图标菜单的句柄   
  return   m_menu.Detach();   
    
    
  }   
  5.在CBmpMenuApp的InitInstance函数中加入如下代码,设置图标菜单为主窗口的菜单:   
  BOOL   CBmpMenuApp::InitInstance()   
  {   
  .......   
  .......   
  .........   
    
  ........   
  if   (!ProcessShellCommand(cmdInfo))   
  return   FALSE;   
    
  //将默认的菜单清除   
  CMenu*   pMenu   =   m_pMainWnd->GetMenu();   
  if   (pMenu)pMenu->DestroyMenu();   
  //设置菜单为新的图标菜单   
  HMENU   hMenu   =   ((CMainFrame*)   m_pMainWnd)->NewMenu();   
  pMenu   =   CMenu::FromHandle(   hMenu   );   
  m_pMainWnd->SetMenu(pMenu);   
  ((CMainFrame*)m_pMainWnd)->m_hMenuDefault   =   hMenu;   
    
  //   The   one   and   only   window   has   been   initialized,   so   show   and   update   it.   
  m_pMainWnd->ShowWindow(SW_SHOW);   
  m_pMainWnd->UpdateWindow();   
    
  return   TRUE;   
  }   
  6.在CMainFrame中加入WM_MEASUREITEM,WM_MENUCHAR和WM_INITMENUPOPUP,3个消息的响应函数,其代码如下:   
  void   CMainFrame::OnMessageItem(int   nIDCtl,LPMEASUREITEMSTRUCT   lpMeasureItemStruct)   
  {   
                  //TODO:Add   your   message   handler   code   here   and/or   call   default   
  BOOL   setflag=FALSE;   
  if(lpMeasureItemStruct->CtlType==ODT_MENU)   
  {   
  if(IsMenu((HMENU)lpMeasureItemStruct->itemID))   
  {   
  CMenu   *   cmenu=CMenu::FromHandle((HMENU)lpMeasureItemStruct->itemID);   
    
  if(m_menu.IsMenu(cmenu))   
  {   
  m_menu.MeasureItem(lpMeasureItemStruct);   
  setflag=TRUE;   
  }   
  }   
  }   
  if(!setflag)   
  CFrameWnd::OnMeasureItem(nIDCtl,lpMeasureItemStruct);   
  }   
    
  LRESULT   CMainFrame::OnMenuChar(UNIT   nChar,UNIT   nFlags,CMenu   *   pMenu)   
  {   
  //TODO:Add   your   message   handler   code   here   and/or   call   default   
  LRESULT   lresult;   
  if(m_menu.IsMenu(pMenu))   
  lresult=BCMenu::FindKeyboardShortcut(nChar,nFlags,pMenu);   
  else     
  lresult=CFrameWnd::OnMenuChar(nChar,nFlags,pMenu);   
  return(lresult);   
  }   
    
  void   CMainFrame::OnInitMenuPopup(CMenu   *   pPopupMenu,UNIT   nIndex,BOOL   bSysMenu)   
  {   
  CFrameWnd::OnInitMenuPopup(pPopupMenu,nIndex,bSysMenu);   
  if(!bSysMenu)   
  {   
  if(m_menu.IsMenu(pPopupMenu))   
  BCMenu::UpdateMenu(pPopupMenu);   
  }   
  } 




这么一大段程序    我只是想知道第三步如何完成

回复列表 (共1个回复)

沙发

在CMainFrame的头文件 上方添加#include"BCMenu.h"

我来回复

您尚未登录,请登录后再回复。点此登录或注册