1、创建基于对话框的MFC
2、在资源视图中添加menu
右键资源视图,添加menu,并编辑菜单。然后在主框体的menu
属性中选择菜单栏的ID。到此,菜单即可正常显示。
3、菜单打钩
右键菜单某一选项(比如“校正”),选择添加事件处理程序。
1、先选择COMMAND
消息,编辑代码,先创建全局变量bool state = false
,然后在该事件处理函数的代码中添加如下代码:
void C菜单打钩Dlg::On32771()
{
// TODO: 在此添加命令处理程序代码
state = !state;
}
2、再选择UPDATE_COMMAND_UI
消息,编辑代码,添加如下代码:
void C菜单打钩Dlg::OnUpdate32771(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->SetCheck(state);
}
理论上,此时点击菜单会打钩/取消打钩,但是模态/非模态对话框是不响应菜单UPDATE_COMMAND_UI
消息的,需要增加对WM_INITMENUPOPUP
消息的处理以后,才可以响应UPDATE_COMMAND_UI
。
3、在消息映射中添加ON_WM_INITMENUPOPUP()
项,如下图
4、在Dlg.h中,添加OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
函数声明,如下图,然后在Dlg.cpp中,添加OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
函数(直接复制即可)。
void C菜单打钩Dlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
// TODO: Add your message handler code here
if (!bSysMenu && pPopupMenu)
{
CCmdUI cmdUI;
cmdUI.m_pOther = NULL;
cmdUI.m_pMenu = pPopupMenu;
cmdUI.m_pSubMenu = NULL;
UINT count = pPopupMenu->GetMenuItemCount();
cmdUI.m_nIndexMax = count;
for (UINT i = 0; i<count; i++)
{
UINT nID = pPopupMenu->GetMenuItemID(i);
if (-1 == nID || 0 == nID)
{
continue;
}
cmdUI.m_nID = nID;
cmdUI.m_nIndex = i;
cmdUI.DoUpdate(this, FALSE);
}
}
}