CMFCMenuButton的菜单如何获取某个菜单项的check状态

[复制链接]
查看11 | 回复6 | 2021-1-27 05:14:18 | 显示全部楼层 |阅读模式
想在主窗口中使用CMFCMenuButton控件实现如下图所示的菜单按钮,需要在用户点击“允许数据采集”菜单项时获取菜单项的选中状态,并改变check状态,使得设置生效。


其中菜单资源文件为IDR_MENU_STORAGE,“允许数据采集”菜单项ID为ID_MENU_ALLOW_STORAGE。
我在窗口的OnInitDialog()中实现如下代码:
//IDR_MENU_STORAGE
CMenu*pMenuStorage=newCMenu;
if(TRUE==pMenuStorage->LoadMenu(IDR_MENU_STORAGE))//载入菜单资源
{
m_menubtn_storage.m_hMenu=pMenuStorage->GetSubMenu(0)->GetSafeHmenu();
}else
{
TRACE("resourceloadfailed!");
}
在按钮响应行数中实现代码如下:
voidCATC_TestSvcDlg::OnBnClickedMfcmenubuttonDatastorage()
{
//TODO:在此添加控件通知处理程序代码
switch(m_menubtn_storage.m_nMenuResult)
{
caseID_MENU_ALLOW_STORAGE:
{
CMenu*pMenu=m_menubtn_storage.GetMenu();
if(pMenu)
{
UINTstate=pMenu->GetMenuState(ID_MENU_ALLOW_STORAGE,MF_BYCOMMAND);
ASSERT(state!=0xFFFFFFFF);
if(state&MF_CHECKED)
pMenu->CheckMenuItem(ID_MENU_ALLOW_STORAGE,MF_UNCHECKED|MF_BYCOMMAND);
else
pMenu->CheckMenuItem(ID_MENU_ALLOW_STORAGE,MF_CHECKED|MF_BYCOMMAND);
}
}
break;
caseID_MENU_..........:
break;
default:
break;
}
在执行点击“允许数据采集”菜单项,获得响应后,在程序执行到红色代码段时,出现异常如图所示:

显示hMenu为unused
这个问题困扰很久,求大神解救
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
感觉是在CMenu*pMenu=m_menubtn_storage.GetMenu();这个地方出了问题,不知道有什么方法可以从CMFCMenuButton对象获取到相应的菜单对象
回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
不是很懂楼主。菜单check状态,是在voidCMainFrame::OnUpdateXX(CCmdUI*pCmdUI)里设置的(根据相关变量)。你直接使用这个相关变量判断就行啦。

回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
原因在你按钮响应的代码里面
//TODO:在此添加控件通知处理程序代码
switch(m_menubtn_storage.m_nMenuResult)
{
caseID_MENU_ALLOW_STORAGE:
{
CMenu*pMenu=m_menubtn_storage.GetMenu();
if(pMenu)
CMenu*pMenu=m_menubtn_storage.GetMenu();就是这句,CMenu类中没有GetMenu()这个成员函数,你这样写肯定是有问题的
如果你要得到主窗口你菜单的指针那就用FromHandle函数,它的功能是:返回一个指向给定Windows菜单句柄的CMenu对象的指针

回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
你这样干太复杂了,一般这样干:直接在你菜单项的点击响应中代码里,给对应的菜单项打check就好了(打对勾有专门的函数),然后使其它的菜单项disable(就是不可选,也有对应的函数)。其它的每个菜单项的点击响应代码中都这样做。但愿你能理解我的意思。
回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
ON_UPDATE_COMMAND_UI()
pCmdUI->Check(TRUE/FALSE);
回复

使用道具 举报

千问 | 2021-1-27 05:14:18 | 显示全部楼层
可能你用菜单的时候,菜单并不存在
用一个内部变量记录状态,弹出菜单的时候更新状态,判断的时候也用内部变量
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行