MFC 如何启用/禁用菜单(返灰/不可点击状态)

这篇具有很好参考价值的文章主要介绍了MFC 如何启用/禁用菜单(返灰/不可点击状态)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、为页面(窗口)添加一个菜单栏和子菜单

2、在XXDlg.h文件中定义一个菜单栏变量和bool变量

CMenu m_Menu;	//菜单变量
bool m_EnableMenu;//菜单栏中某个子菜单禁用/启用(变灰)的控制变量

3、在OnInitDialog函数中进行初始化:(即将菜单栏植入主界面)

m_Menu.LoadMenu(IDR_MENU_MAIN);//菜单栏的ID
SetMenu(&m_Menu);//添加入到界面
m_EnableMenu =false;//初始化为禁用子菜单

4、添加菜单ID的ON_UPDATE_COMMAND_UI消息,点击菜单,在子菜单上右键点击,添加事件处理程序,选择你的对话框类,在左边的消息类型中选择UPDATE_COMMAND_UI添加如下代码:
mfc按钮不可点击,vs2010,mfc,C++,mfc,c++,VS2010

void CXXDlg::OnUpdateDisconnectAll(CCmdUI *pCmdUI)
{
	pCmdUI->Enable(m_EnableMenu); //m_EnableMenu的值对应禁用和启用,1是启用,0是禁用
} 

根据网上资料,对于视图文档类MFC程序,在主框架类CMainFrame的构造函数中把成员变量m_bAutoMenuEnable=FALSE就可以解决问题了。但是基于对话框的MFC应用程序没有m_bAutoMenuEnable变量。解决方法:

5、在对话框类的消息中加入OnInitMenuPopup()消息:
mfc按钮不可点击,vs2010,mfc,C++,mfc,c++,VS2010

消息函数内重载如下:

void CXXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
     CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

   	// TODO: 在此处添加消息处理程序代码
   
	ASSERT(pPopupMenu != NULL);
	// Check the enabled state of various menu items.
	CCmdUI state;
	state.m_pMenu = pPopupMenu;
	ASSERT(state.m_pOther == NULL);
	ASSERT(state.m_pParentMenu == NULL);
	// Determine if menu is popup in top-level menu and set m_pOther to
	// it if so (m_pParentMenu == NULL indicates that it is secondary popup).
	HMENU hParentMenu;
	if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
		state.m_pParentMenu = pPopupMenu;    // Parent == child for tracking popup.
	else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
	{
		CWnd* pParent = this;
		// Child windows don't have menus--need to go to the top!
		if (pParent != NULL &&
			(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
		{
			int nIndexMax = ::GetMenuItemCount(hParentMenu);
			for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
			{
				if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
				{
					// When popup is found, m_pParentMenu is containing menu.
					state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
					break;
				}
			}
		}
	}
	state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
	for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
		state.m_nIndex++)
	{
		state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
		if (state.m_nID == 0)
			continue; // Menu separator or invalid cmd - ignore it.
		ASSERT(state.m_pOther == NULL);
		ASSERT(state.m_pMenu != NULL);
		if (state.m_nID == (UINT)-1)
		{
			// Possibly a popup menu, route to first item of that popup.
			state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
			if (state.m_pSubMenu == NULL ||
				(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
				state.m_nID == (UINT)-1)
			{
				continue;       // First item of popup can't be routed to.
			}
			state.DoUpdate(this, TRUE);   // Popups are never auto disabled.
		}
		else
		{
			// Normal menu item.
			// Auto enable/disable if frame window has m_bAutoMenuEnable
			// set and command is _not_ a system command.
			state.m_pSubMenu = NULL;
			state.DoUpdate(this, FALSE);
		}
		// Adjust for menu deletions and additions.
		UINT nCount = pPopupMenu->GetMenuItemCount();
		if (nCount < state.m_nIndexMax)
		{
			state.m_nIndex -= (state.m_nIndexMax - nCount);
			while (state.m_nIndex < nCount &&
				pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
			{
				state.m_nIndex++;
			}
		}
		state.m_nIndexMax = nCount;
	}
}

如果想在其他程序中改变菜单的启用/禁用属性,改变m_EnableMenu的值即可实现。文章来源地址https://www.toymoban.com/news/detail-733124.html

到了这里,关于MFC 如何启用/禁用菜单(返灰/不可点击状态)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在 Ubuntu 20.04 桌面上启用/禁用 wayland

    Wayland 是一种通信协议,指定显示服务器与其客户端之间的通信。 默认情况下,Ubuntu 20.04 桌面不会启动 Wayland,而是加载 Xorg 显示服务器X11。 在本教程中您将学习: 如何启用 Wayland 如何禁用 Wayland    类别 要求、约定或使用的软件版本 系统 Installed Ubuntu 20.04 or upgraded Ubu

    2024年02月16日
    浏览(38)
  • 如何使用 CMD 命令禁用或启用笔记本自带键盘?

    虽然现在的笔记本越来越薄,但是笔记本键盘并不一定好用,很多人购买了笔记本后除了出差临时使用自带键盘外,估计有很多用户喜欢外置键盘使用。而有些时候,如果您的笔记本键盘出现损坏,那么使用外置键盘无疑是个好方法。如果您因为自带键盘无法使用或损坏同时

    2024年02月12日
    浏览(34)
  • 使用element-ui导航,进入对应的三级页面菜单保持点击状态

    01.路由中使用了keepAlive属性,要用keepAlive:true,不能等于false,使用false页面会刷新 路由配置

    2024年02月10日
    浏览(30)
  • 如何在本地组策略编辑器中启用或禁用剪贴板历史记录

    复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验

    2024年02月13日
    浏览(37)
  • 在插入鼠标时禁用触摸板,并在没有鼠标时自动启用触摸板。取消勾选连接鼠标时让触摸板保持打开状态,但拔掉鼠标后触摸板依旧不能使用

    设置没问题,但是拔掉鼠标后,触摸板依旧不能使用; 解决方法: 1、检查触摸板:勾选连接鼠标时让触摸板保持打开状态,此时查看触摸板是否正常,如果正常说明触摸板没有问题。 2、禁用虚拟鼠标:按“win”+“x”选择设备管理器 - 鼠标和其他指针设备-通过拔插鼠标判

    2024年02月09日
    浏览(32)
  • 在element UI的下拉多选框里如何实现禁用默认值和不可删除默认值

     移动到默认值上会变成禁用的图标,点击没有反应。 在做到默认值不能删除这部分时,我看大部分都是在main,js里定义一个自定义指令,我没有用自定义指令,可以说我的方法非常原始?就是笨办法吧,下面是我的解决方法。 1、首先,肯定要在data里定义一个数组,专门存放

    2024年02月10日
    浏览(29)
  • 微信公众号启用了服务器配置如何自定义菜单?

    微信公众号(服务号)启用了服务器配置,如何自定义菜单呢? 当我们启用了服务器配置,公众号的默认的自定义菜单就会失效。其实我们可以通过调用API接口来完成自定义菜单功能的配置。 微信公众号自定义菜单接口文档:微信开放文档 目录 一、获取Access_TOKEN 二、创建

    2024年02月09日
    浏览(46)
  • css - 如何禁用 <a> 标签点击,让 <a> 标签实现 disabled 禁用效果(鼠标无法触发点击事件)

    我们知道a标签是没有disabled属性的,那么我们该如何实现a标签按钮的禁用呢? 给a标签设置 “禁用” 属性,如下代码所示: 这样 @click 点击事件就不会触发了。 使用 jquery:removerAttr() 或者 JS:removeAttribute() 移除 a 标签的 href 属性。 使用 jquery:unbind() 或者 JS:removeEventListe

    2024年01月16日
    浏览(48)
  • MFC 如何修改MF_POPUP菜单项文本

             MFC 修改MF_POPUP菜单项文本的方法有点特别,记录下来备忘。         关键点是ModifyMenu()函数会把关联的下级菜单的句柄与菜单文本一起修改,因此需要把之前关联的下级菜单提取出来,调用ModifyMenu()把它放回去。

    2024年02月13日
    浏览(26)
  • vue3如何实现点击不同的菜单页切换局部页面

    我们可以使用router来实现 去饿了么(element-plus)找到自己喜欢的页面然后按需导入,以下以自己的例子来实现 首先引入布局容器 然后引入菜单栏 引入这两个,先看效果 此时基本的页面准备好了 容器是有这个属性的,但默认值为false 并把菜单栏里对应的文字改为router-link 在

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包