2010-05-11 125 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