2010-05-11 8 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); 

올바른 메뉴는 항목 수를 올바르게 표시합니다. 나는 최대 값을 설정했다.

내가 선택한 항목 인덱스를 가져올 때 내 문제가 발생합니다. 이를 위해 , 내가


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

내가 뭔가를 놓친나요 현물 kEventClassMenu 이벤트 &을 kEventMenuClosed 사용할 수 있습니까? 그것을 첨부하는 것이 올바른 행사입니까?

많은 도움에 감사드립니다.

답변

0

아마도 kEventClassCommand/kEventProcessCommand를 처리하고 메뉴 항목에서 id 명령을 사용하고 싶을 것입니다. commandID가 AppendMenuItemTextWithCFString의 파라미터 중 하나임

HICommand   command; 

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

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

참고; 메뉴를 생성 할 때 각 항목에 고유 한 commandID를 부여 할 수 있습니다. commandID는 일반적으로 '열기'또는 '저장'과 같은 4 자 코드이지만, 동적으로 생성 된 명령에는 단순한 int를 사용할 수 없습니다.

+0

감사합니다.하지만이 코드는 (4-char 코드 생성)을 피하고 싶습니다. 실제로 인덱스가 필요합니다. – Ziggy

+0

요점을 놓치 셨습니다. commandID는 단순히 32 비트 int (UInt32)입니다. 인터페이스 빌더를 사용하여 만든 메뉴 항목에 의미있는 4-char 코드를 사용하는 것이 일반적이지만, 순차적 정수를 사용할 수없는 이유는 없습니다. –

+0

알았어, 조언 주셔서 감사합니다. – Ziggy

관련 문제