MFC菜单栏打钩

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);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值