一:处理按键事件
当用户按下某个按键时,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定义,代表按键的键码。
阅读(430) | 评论(0) | 转发(0) |