问题描述
我必须尝试禁用子菜单项:
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
指定要采取的措施。它可以是组合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);