当前位置: 首页 > 编程技术 > 正文

解决菜单栏禁用后不能恢复的情况

在MFC中,禁用菜单栏的函数是EnableMenuItem,它在MSDN中定义如下:

UINT EnableMenuItem(   UINT nIDEnableItem,   UINT nEnable );

函数的第二个参数就是决定了菜单栏的禁用和恢复,

  • MF_DISABLED   禁用菜单,使之不能被点击

  • MF_ENABLED   恢复菜单,使之可以点击

首先先来简单的实现下右键弹出菜单栏功能吧,示例代码如下:

	CMenu Menu;
	CMenu * pSubMenu;

	Menu.LoadMenuA(IDR_MENU1);
	pSubMenu = Menu.GetSubMenu(0);

	pSubMenu->EnableMenuItem(ID_HELLO_WORD5, MF_DISABLE);
	CPoint Point;
	GetCursorPos(&Point);  //得到当前的鼠标的坐标

	pSubMenu->TrackPopupMenu( //弹出菜单
		TPM_LEFTALIGN,     //鼠标在菜单的左边,即菜单在鼠标右边显示
		Point.x,
		Point.y,
		this
	);

至于如何实现右键弹出,直接加一个鼠标右键的消息 响应函数就可以了

上面的代码实现了弹出菜单,并且禁用了指定的菜单,

但是如果我们想要在禁用后恢复怎么办,

如果在菜单被禁用后,修改上面的代码使菜单可用:

pSubMenu->EnableMenuItem(ID_HELLO_WORD5, MF_ENABLE);

    但是在编译后,发现菜单依然是禁用的,菜单并没有和我们原来想的那样变得可以点击了,这个是什么回事呢?

在SDI初始化是,m_bAutoMenuEnable的默认值是TRUE,

m_bAutoMenuEnable的作用:一个Menu的布尔类型的数据成员,当用户弹出一个菜单是,是否ON_UPDATE_COMMAND_UI或者是ON_COMMAND消息自动被禁用,如果被设定为TRUE,也是默认的,这些消息会自动被禁止,

通过上面我们知道,如果m_bAutoMenuEnable被设定为FALSE的话,那么就不会自动禁用消息了,

因此我们将源码修改为:

	this->m_bAutoMenuEnable = FALSE;  //不自动禁用消息
	CMenu Menu;
	CMenu * pSubMenu;

	Menu.LoadMenuA(IDR_MENU1);
	pSubMenu = Menu.GetSubMenu(0);

	pSubMenu->EnableMenuItem(ID_HELLO_WORD5, MF_ENABLED);
	CPoint Point;
	GetCursorPos(&Point);  //得到当前的鼠标的坐标

	pSubMenu->TrackPopupMenu( //弹出菜单
		TPM_LEFTALIGN,     //鼠标在菜单的左边,即菜单在鼠标右边显示
		Point.x,
		Point.y,
		this
	);

重新编译后你会发现,禁用的菜单又恢复了,



本文固定链接: http://kuaile.in/archives/1112 | 蒲公英的博客

该日志由 蒲公英 于2012年07月13日发表在 编程技术 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 解决菜单栏禁用后不能恢复的情况 | 蒲公英的博客
关键字: ,
【上一篇】
【下一篇】

解决菜单栏禁用后不能恢复的情况:等您坐沙发呢!

发表评论


You must enable javascript to see captcha here!

快捷键:Ctrl+Enter