在 SDI 中使用 BCMenu,首先,自然是建立一个 SDI 工程,然后将“BCMenu.h”和“BCMenu.cpp”放入文件夹下,单击"工程"->"增加到工程"->"文件",将"BCMenu.h"和"BCMenu.cpp"两个文件加入工程。
在 MainFrm.h 这个头文件里的成员函数 CMainFrame 里添加类型为 public 的脚本:
BCMenu m_menu;
HMENU NewMenu();
在 MainFrm.h 这个头文件的里添加下面的脚本:
#include "BCMenu.h"
打开 Mainfrm.cpp 文件并加入下面的函数:
HMENU CMainFrame::NewMenu()
{
m_menu.LoadMenu(IDR_MAINFRAME);
m_menu.LoadToolbar(IDR_MAINFRAME);
return(m_menu.Detach());
}
编辑 C***App (***是你取的程序名字)里的 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;
在 CMainFrame 类里添加消息处理函数:WM_MEASUREITEM、WM_MENUCHAR 和 WM_INITMENUPOPUP。添加方法是在 CMainFrame 类上右击鼠标选择 Add Windows Message Handler ,在右下角的选择框里选中 Window ,再在左面的列表里分别选择 WM_MEASUREITEM、WM_MENUCHAR 和 WM_INITMENUPOPUP 并单击 Add and Edit 按钮,然后加入下面的脚本:
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
BOOL setflag=FALSE;
if(lpMeasureItemStruct->CtlType==ODT_MENU){
if(IsMenu((HMENU)lpMeasureItemStruct->itemID)){
CMenu* cmenu=CMenu::FromHandle((HMENU)lpMeasureItemStruct->itemID);
if(BCMenu::IsMenu(cmenu)){
m_menu.MeasureItem(lpMeasureItemStruct);
setflag=TRUE;
}
}
}
if(!setflag)CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
LRESULT CMainFrame::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)
{
LRESULT lresult;
if(BCMenu::IsMenu(pMenu))
lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
else
lresult=CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
return(lresult);
}
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if(!bSysMenu){
if(BCMenu::IsMenu(pPopupMenu))BCMenu::UpdateMenu(pPopupMenu);
}
}
构建运行一下,我们发现现在的菜单是 ORIGINAL 风格,要改成 XP 风格的话,请在适当的地方(如: CMainFrame 类里的 OnCreate 成员函数里。)加入下面的脚本:
BCMenu::SetMenuDrawMode(BCMENU_DRAWMODE_XP);