|
程序在按下option后弹出功能菜单,有5项, 我要实现在功能菜单出现后,按下1、2、3、4、5按键时分别调用这5项。
我想到了两个可行的方案
1. 使用CAknPopupList Popup List在外观上跟菜单很像,因此你完全可以定制一个Popup List,在用户按左软键时弹出,选择某项时撤消。 SDK中的"\Series60Ex\popuplist"示例程序讲了CAknPopupList的用法。
2. 调整控件在控件堆栈中的优先级
在把控件加入到控件堆栈中时指定一个比较高的优先级,这样的话无论有什么按键都会先交给它处理。例如: void CMyAppUi::ConstructL() { ... AddToStackL( iAppContainer,ECoeStackPriorityDialog ); ... }
在弹出菜单时系统会调用DynInitMenuPaneL(),在这个函数时你可以标明菜单已经弹出来了 void CMyAppUi::DynInitMenuPaneL(...) { ... iPopup = ETrue; ... }
而AppUi处理完菜单命令之后可以认为菜单已经撤消了 void CMyAppUi::HandleCommandL(...) { iPopup = EFalse; ... }
在控件的OfferKeyEventL()里处理按键 void CMyContainer::OfferKeyEventL(...) { if(!iMyAppUi->Popup()) // 如果菜单未弹出则不处理 { return EKeyWasNotConsumed }
if(aType == EEventKey) { // 如果用户在菜单弹出时按了"1" if(aKeyEvent.iCode=='1') { // 模拟按键,撤消菜单 TRawEvent key; key.Set(TRawEvent::EKeyDown, 165); iCoeEnv->WsSession().SimulateRawEvent(key); User::After(500000); // 延迟一小会儿 // 处理菜单命令 iMyAppUi->HandleCommandL(...); return EKeyWasConsumed; } } return EKeyWasNotConsumed; }
|