您好我需要使用弹出式菜单,动态创建。
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 !!!!!
}
}
我错过了什么吗?是附加的正确事件吗?
非常感谢您的帮助。
答案 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来动态生成命令。