2010-05-11 127 views
0

你好我需要使用弹出式菜单,女巫是动态创建的。MenuRef GetControl32BitValue总是返回0


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

难道我错过了什么?这是正确的事件吗?

非常感谢您的帮助。

回答

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'),但没有理由不能为动态生成的命令使用简单的整数。

+0

谢谢,但这是我想避免(生成4个字符的代码),我真的需要一个索引。 – Ziggy 2010-05-11 15:50:15

+0

你错过了一点:commandID只是一个32位int(UInt32)。虽然通常使用有意义的4字符代码来创建使用界面生成器创建的菜单项,但如果最适合您,则无法使用顺序整数。 – 2010-05-11 16:49:20

+0

好的,谢谢你的建议,听起来好像这样:) – Ziggy 2010-05-14 07:17:56