visual-c++ - 我必须禁用子菜单 mfc c++
问题描述
我必须禁用子菜单项,我试过:
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
CMenu* pSubMenu = pMenu->GetSubMenu(1);
if (pMenu != NULL)
{
//for (UINT i = 0; i < pMenu->GetMenuItemCount(); ++i)
pSubMenu->EnableMenuItem(ID_FILE_CONFRONTO_GRAFICI, MF_BYPOSITION | MF_GRAYED);
}
解决方案
我解决了这个问题:
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
CMenu * subMenu = pMenu->GetSubMenu(0);
if (subMenu != NULL)
{
subMenu->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED);
}
澄清
EnableMenuItem
有以下定义:
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable);`
要理解的重要一点是正确使用最后一个nEnable
参数。去引用:
nEnable
指定要执行的操作。它可以是, , or , 与or 的组合。可以使用按位运算符组合这些值 。这些值具有以下含义:MF_DISABLED
MF_ENABLED
MF_GRAYED
MF_BYCOMMAND
MF_BYPOSITION
OR
MF_BYCOMMAND
指定参数给出现有菜单项的命令 ID。这是默认设置。
MF_BYPOSITION
指定参数给出现有菜单项的位置。第一项位于位置 0。
在您的原始代码中:
pSubMenu->EnableMenuItem(ID_FILE_CONFRONTO_GRAFICI, MF_BYPOSITION | MF_GRAYED);
问题:
- 您使用了
MF_BYPOSITION
(这意味着nIDEnableItem
是一个从零开始的索引)但是...... - 您用于
ID_FILE_CONFRONTO_GRAFICI
第一个参数。
所以有两种方法可以做到这一点(有一些例外):
subMenu->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED);
subMenu->EnableMenuItem(ID_FILE_CONFRONTO_GRAFICI, MF_BYCOMMAND | MF_DISABLED);