MenuRef GetControl32BitValue始终返回0

时间:2010-05-11 12:07:37

标签: menu macos-carbon

您好我需要使用弹出式菜单,动态创建。


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 kind


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 !!!!!
    }
}

我错过了什么吗?是附加的正确事件吗?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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-char代码(如'open'或'save'),但没有理由不能使用简单的int来动态生成命令。