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

njubanana 2018-09-29 05:01:36
想在主窗口中使用CMFCMenuButton控件实现如下图所示的菜单按钮,需要在用户点击“允许数据采集”菜单项时获取菜单项的选中状态,并改变check状态,使得设置生效。


其中菜单资源文件为 IDR_MENU_STORAGE,“允许数据采集”菜单项ID为 ID_MENU_ALLOW_STORAGE。

我在窗口的OnInitDialog()中实现如下代码:
// IDR_MENU_STORAGE
CMenu* pMenuStorage = new CMenu;
if(TRUE == pMenuStorage->LoadMenu(IDR_MENU_STORAGE)) // 载入菜单资源
{
m_menubtn_storage.m_hMenu = pMenuStorage->GetSubMenu(0)->GetSafeHmenu();
}else
{
TRACE("resource load failed!");
}

在按钮响应行数中实现代码如下:
void CATC_TestSvcDlg::OnBnClickedMfcmenubuttonDatastorage()
{
// TODO: 在此添加控件通知处理程序代码
switch(m_menubtn_storage.m_nMenuResult)
{
case ID_MENU_ALLOW_STORAGE:
{
CMenu* pMenu = m_menubtn_storage.GetMenu();
if(pMenu)
{
UINT state = 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;
case ID_MENU_..........:
break;
default:
break;
}

在执行点击“允许数据采集”菜单项,获得响应后,在程序执行到红色代码段时, 出现异常如图所示:

显示hMenu为unused

这个问题困扰很久,求大神解救
...全文
744 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2018-10-18
  • 打赏
  • 举报
回复
可能你用菜单的时候,菜单并不存在
用一个内部变量记录状态, 弹出菜单的时候更新状态,判断的时候也用内部变量
Eleven 2018-10-17
  • 打赏
  • 举报
回复
ON_UPDATE_COMMAND_UI()
pCmdUI->Check(TRUE/FALSE);
みしつかん 2018-10-17
  • 打赏
  • 举报
回复
你这样干太复杂了,一般这样干:直接在你菜单项的点击响应中代码里,给对应的菜单项打check就好了(打对勾有专门的函数),然后使其它的菜单项disable(就是不可选,也有对应的函数)。其它的每个菜单项的点击响应代码中都这样做。但愿你能理解我的意思。
みしつかん 2018-10-17
  • 打赏
  • 举报
回复
原因在你按钮响应的代码里面

// TODO: 在此添加控件通知处理程序代码
switch(m_menubtn_storage.m_nMenuResult)
{
case ID_MENU_ALLOW_STORAGE:
{
CMenu* pMenu = m_menubtn_storage.GetMenu();
if(pMenu)

CMenu* pMenu = m_menubtn_storage.GetMenu(); 就是这句,CMenu类中没有GetMenu()这个成员函数,你这样写肯定是有问题的
如果你要得到主窗口你菜单的指针那就用FromHandle函数,它的功能是:返回一个指向给定Windows菜单句柄的CMenu对象的指针
叶恭介叶恭介 2018-09-30
  • 打赏
  • 举报
回复
不是很懂楼主。菜单check状态,是在void CMainFrame::OnUpdateXX(CCmdUI *pCmdUI)里设置的(根据相关变量)。你直接使用这个相关变量判断就行啦。
njubanana 2018-09-29
  • 打赏
  • 举报
回复
感觉是在 CMenu* pMenu = m_menubtn_storage.GetMenu();这个地方出了问题,不知道有什么方法可以从CMFCMenuButton对象获取到相应的菜单对象

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧