2010-05-11 7 views
0

Bonjour, j'ai besoin d'un menu contextuel créé dynamiquement.MenuRef GetControl32BitValue retourne toujours 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); 

Ceci est correct, menu affiche le nombre correct d'éléments. Je définis la valeur maximale.

Mon problème se produit lorsque je veux obtenir l'index d'élément sélectionné. Pour cela, j'utilise l'événement kEventClassMenu & kEventMenuClosed type


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

Ai-je raté quelque chose? est-ce le bon événement à attacher?

Un grand merci pour votre aide.

Répondre

0

Vous souhaitez probablement gérer kEventClassCommand/kEventProcessCommand et utiliser l'ID de commande à partir de l'élément de menu.

HICommand   command; 

GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, 
      sizeof(HICommand), NULL, &command); 

switch (command.commandID) { 
    case 1: 
     ... etc ... 

Notez que le commandID est l'un des paramètres à AppendMenuItemTextWithCFString; C'est ainsi que vous pouvez attribuer à chaque élément un ID de commande unique lorsque vous générez le menu. commandID sont classiquement des codes à 4 caractères (comme 'open' ou 'save'), mais il n'y a pas de raison que vous ne puissiez pas utiliser ints simples pour vos commandes générées dynamiquement.

+0

Merci, mais ce que je voudrais éviter (générant un code de 4 caractères), j'ai vraiment besoin d'un index. – Ziggy

+0

Il vous manque le point: le commandID est simplement un int 32 bits (UInt32). Bien qu'il soit classique d'utiliser des codes à 4 caractères significatifs pour les éléments de menu créés à l'aide de l'outil de création d'interface, il n'y a aucune raison de ne pas utiliser d'entiers séquentiels si cela vous convient. –

+0

Comment ok, merci pour le conseil, sonne mieux comme ça :) – Ziggy