Symbian处理按键事件
2010-10-20 07:59:52 来源:WEB开发网一:处理按键事件
当用户按下某个按键时,Symbain OS的窗口服务器(Windows Server)会向应用程序发送一个窗口服务器事件(Windows Server Event)。应用程序AppUi的HandleWsEventL()函数接收到这个事件,并对该事件进行解析,如果是按键事件则通过调用控件的 OfferKeyEventL()函数把它转发给控件堆栈(Cotrol Stack)中的控件处理。AppUi首先将事件转发给控件堆栈中优先级最高的控件,如果它的OfferKeyEventL()函数的返回值是 EKeyWasConsumed,说明按键事件已经被处理。如果返回值是EKeyWasNotOnsumed,说明控件没有处理该事件,此时AppUi按优先级的高低将事件转发给控件堆栈的下一个控件,如果所有控件都没有处理该事件则AppUi会调用自己的HandleKeyEventL()函数处理,按键事件的处理流程如下图所示:
如果控件需要响应按键事件,则需要重载OfferKeyEventL()函数,并且应用程序要事先调用AppUi类的AddToStackL()函数将控件压入控件堆栈。在基于控件的应用程序中,只需要将拥有窗口的主控件压入堆栈,它接受到按键事件后再转发给各个子控件。例如如果用户按下的是方向导航键,主控件负责调整各个子控件的激活状态;如果用户按下的是其他按键,则将这个按键事件转发给当前激活的控件处理。
按键事件通过TEventCode和TKeyEvent两个类型的变量表示,这两个类型都在w32std.h文件中定义。TEventCode类代表事件的类型,对于按键事件,TEventCode的值是一下三个值中的一个
1: EEventKeyDown: 按键按下的时候,窗口服务器发出该消息。
2:EEventKeyUp: 按键抬起的时候,窗口哦服务器发出该消息。
3:EEventKey: 一般的按键消息,按键按下之后且抬起之前发出。
其中EEventKeyDown与EEventKey的不同在于,EEventKey长时间按住的话,窗口服务器会不断的发出该消息,而EEventKEeyDown按下之后,窗口服务器只会发送一次该消息。
大部分程序不需要处理EEventKeyDown和EEvnetKeyUp事件,只处理一般的按键事件EEventKey即可,此时控件对按键的响应是在按键抬起之前完成的。如果程序对按键的按下和抬起响应不同,或者要在按键抬起之后才处理按键事件,则需要对另外两个事件做特殊处理。
TKeyEvent类对按键事件进行了更详细的描述,定义代码如下:
struct TKeyEvent
{
TUint iCode;
TInt iScanCode;
TUit iModifiers;
TInt iRequests;
}
大多数应用程序只需要处理iCode,其取值由e32keys.h文件中的枚举类型TKeyCode定义,代表按键的键码。
- ››处理报错:java/lang/NoClassDefFoundError: java...
- ››Symbian S60 SocketConnection参数
- ››Symbian乏力:2010年诺基亚悲情大事记
- ››Symbian三大升级开启2011年新战略
- ››Symbian/Android/iOS/WM安装包对比
- ››Symbian一个活动对象的测试例子
- ››Symbian ListBox控件
- ››Symbian下自动切换SDK的批处理代码
- ››Symbian 3 版的 Swype 输入法正式上架
- ››Symbian中的设计模式
- ››Symbian S60平台JAVA开发环境搭建步骤
- ››Symbian自定义控件—如何实现跑马灯效果
更多精彩
赞助商链接