操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

实现热键的功能

2006-10-9 网友评论 0 条 点击进入论坛

程序在按下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;
    }

 

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46430 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail