1、 把
BCMenu.cpp
和
BCMenu.h
文件添加到工程中;
2、
在
MainFrm.h
头文件中包含
BCMenu.h
头文件;
3、
在
MainFrm.h
头文件中添加公有成员变量和成员函数:
#include "BCMenu.h"
public:
BCMenu m_menu;
HMENU NewMenu();
4、 在MainFrm.cpp文件中实现HMENU CMainFrame::NewMenu函数,
用来加载菜单资源和工具栏资源:
HMENU CMainFrame::NewMenu()
{
m_menu.LoadMenu(IDR_MAINFRAME);
m_menu.LoadToolbar(IDR_MYTOOLBAR);
return(m_menu.Detach());
}
5、 编辑应用程序类CWinApp继承类的初始化实例函数InitInstance():
// Dispatch commands specified on the command line
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;
6、 向CMainFrame类添加消息句柄处理函数:
WM_MEASUREITEM, WM_MENUCHAR
和
WM_INITMENUPOPUP
:
(
1
)
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
// TODO: Add your message handler code here
if(!bSysMenu){
if(BCMenu::IsMenu(pPopupMenu)) BCMenu::UpdateMenu(pPopupMenu);
}
}
(
2
)
LRESULT CMainFrame::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)
{
// TODO: Add your message handler code here and/or call default
LRESULT lresult;
if(BCMenu::IsMenu(pMenu))
lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
else
lresult=CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
return(lresult);
//return CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
}
(
3
)
void CMainFrame::OnMeasureItem(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)&&BCMenu::IsMenu((HMENU)lpMeasureItemStruct->itemID)){
m_menu.MeasureItem(lpMeasureItemStruct);
setflag=TRUE;
}
}
if(!setflag)
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
//CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}