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字符代码,但如果顺序整数最适合您,则没有理由不使用顺序整数。