首页 > 解决方案 > 我必须禁用子菜单 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);
        
}

标签: visual-c++mfc

解决方案


我解决了这个问题:

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_DISABLEDMF_ENABLEDMF_GRAYEDMF_BYCOMMANDMF_BYPOSITIONOR

MF_BYCOMMAND指定参数给出现有菜单项的命令 ID。这是默认设置。

MF_BYPOSITION指定参数给出现有菜单项的位置。第一项位于位置 0。

在您的原始代码中:

pSubMenu->EnableMenuItem(ID_FILE_CONFRONTO_GRAFICI, MF_BYPOSITION | MF_GRAYED);

问题:

  1. 您使用了MF_BYPOSITION(这意味着nIDEnableItem是一个从零开始的索引)但是......
  2. 您用于ID_FILE_CONFRONTO_GRAFICI第一个参数。

所以有两种方法可以做到这一点(有一些例外):

  • subMenu->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED);
  • subMenu->EnableMenuItem(ID_FILE_CONFRONTO_GRAFICI, MF_BYCOMMAND | MF_DISABLED);

推荐阅读