主题:[讨论]我有个问题大家帮我解决下,本人刚刚学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);
}
}
这么一大段程序 我只是想知道第三步如何完成
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);
}
}
这么一大段程序 我只是想知道第三步如何完成