MenuRef GetControl32BitValue始终返回0

MenuRef GetControl32BitValue始终返回0,menu,macos-carbon,Menu,Macos Carbon,你好,我需要使用一个弹出菜单,巫婆是动态创建的 OSErr err = GetBevelButtonMenuHandle(m_pRecallAOptionalButton, &m_pRecallAMenuRef); for (countitem) { String szItem (List.GetAt(i)); CFStringRef sz = ToCFStringRef(szItem); AppendMenuItemTextWithCFString(m_pRecallAMenuRef

你好,我需要使用一个弹出菜单,巫婆是动态创建的


OSErr err = GetBevelButtonMenuHandle(m_pRecallAOptionalButton, &m_pRecallAMenuRef);

for (countitem)
{
 String szItem (List.GetAt(i));
 CFStringRef sz = ToCFStringRef(szItem);
 AppendMenuItemTextWithCFString(m_pRecallAMenuRef, sz, 0, 0, 0);
}

short  sCount = CountMenuItems(m_pRecallAMenuRef);
SetControl32BitMaximum(m_pRecallAOptionalButton, sCount);
这是确定的,菜单显示正确的项目数。我设置了最大值

当我想要获取所选项目索引时,会出现问题。 为此,我使用kEventClassMenu事件&kEventMenuClosed类


case kEventClassMenu:
{
    MenuRef Menu;
    GetEventParameter( inEvent, kEventParamDirectObject, typeMenuRef, NULL, sizeof(Menu), NULL, &Menu );

    if (Menu && (Menu == pMainForm->m_pRecallAMenuRef))
    {
      SInt32 nIndex = GetControl32BitMaximum(m_pRecallAOptionalButton); // return the correct items count
      nIndex = GetControl32BitValue(m_pRecallAOptionalButton); // always return 0 !!!!!
    }
}
我错过什么了吗?这是附加的正确事件吗


非常感谢您的帮助。

您可能需要处理kEventClassCommand/kEventProcessCommand,并使用菜单项中的命令id

HICommand           command;

GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL,
            sizeof( HICommand ), NULL, &command );

switch (command.commandID) {
    case 1:
      ... etc ...

请注意,commandID是
AppendMenuItemTextWithCFString
的参数之一;这就是如何在生成菜单时为每个项提供唯一的commandID。commandID通常是4字符代码(如“open”或“save”),但您没有理由不能在动态生成的命令中使用简单的int。

谢谢,但这正是我想要避免的(生成4字符代码),我确实需要一个索引。您遗漏了一点:commandID只是一个32位的int(UInt32)。虽然使用interface builder创建的菜单项通常使用有意义的4字符代码,但如果顺序整数最适合您,则没有理由不使用顺序整数。