如何确定菜单项是否已启用?

时间:2015-07-03 13:54:37

标签: winapi

可以使用EnableMenuItem启用或禁用菜单项。如何确定现有项目是否已启用?

1 个答案:

答案 0 :(得分:4)

是否启用菜单项作为菜单项的状态信息的一部分存储。以下功能报告是否启用了菜单项(由ID标识):

bool IsMenuItemEnabled( HMENU hMenu, UINT uId ) {
    UINT state = GetMenuState( hMenu, uId, MF_BYCOMMAND );
    return !( state & ( MF_DISABLED | MF_GRAYED ) );
}

关于实施的一些注释:

  • 菜单项可以包含MF_DISABLEDMF_GRAYED个状态。禁用的项目看起来就像启用的项目,但在其他情况下不活动。无法选择禁用或灰色项目。 1)
  • MF_ENABLED状态等于0.因此,无法直接测试,但必须使用表达式(请参阅GetMenuState)。


为了完整起见,这是使用较新的API(GetMenuItemInfo)的实现。两种实现在功能上都是相同的:

bool IsMenuItemEnabled( HMENU hMenu, UINT uId ) {
    MENUITEMINFO mii = { 0 };
    mii.cbSize = sizeof( mii );
    mii.fMask = MIIM_STATE;
    GetMenuItemInfo( hMenu, uId, FALSE, &mii );
    return !( mii.fState & MFS_DISABLED );
}


1) 灰色和禁用项目之间的区别记录在About Menus: Enabled, Grayed, and Disabled Menu Items下。这种区别不再在较新的API中公开(请参阅MENUITEMINFO),其中MFS_DISABLEDMFS_GRAYED具有相同的值。