(一)键事件
Symbian中一个键事件由TKeyEvent(键事件结构体)和TEventCode(键事件类型)表示。
TKeyEvent是一个结构体,有4个数据成员:
· iCode:键的字符码,值在TKeyCode中定义,可以通过此值确定按键代表的字符。
· iModifiers:修饰符键的状态,值在TEventModifier中定义,例如:Ctrl和Shift。
· iRepeats:自动重复事件的数量,值为0表示事件无重复,可以通过此值实现长按某键产生特殊效果的功能。
· iScanCode:导致事件的键扫描码,值在TStdScanCode中定义,个人理解这个值表示按键在键盘上的位置,与按键所代表的字符无关,暂时不知道这个值有什么用处。
TEventCode是一个枚举值,它表示键事件的类型:
· EeventKeyDown:按键按下的时候,窗口服务器发出该消息。
· EeventKey:一般的按键消息,按键按下之后且抬起之前发出。
· EeventKeyUp:按键抬起的时候,窗口服务器发出该消息。
(二)OfferKeyEventL()和HandleKeyEventL()的执行顺序
(1)当用户按下某个按键时,Symbain OS的窗口服务器会发送一个窗口服务器事件(TWsEvent),(实际上被转化成TKeyEvent),传给AppUi的HandleWsEventL()函数。
(2)AppUi的HandleWsEventL()函数接收到这个事件,并通过调用控件的 OfferKeyEventL()函数把它转发给控件堆栈(CotrolStack)中的控件处理。
(3)键事件首先被转发给控件堆栈中优先级最高的控件。
· 如果它的OfferKeyEventL()函数的返回值是 EKeyWasConsumed,说明按键事件已经被处理。
· 如果返回值是EKeyWasNotOnsumed,说明控件没有处理该事件,此时AppUi按优先级的高低将事件转发给控件堆栈的下一个控件。
· 如果所有控件都没有处理该事件,则AppUi会调用自己的HandleKeyEventL()函数处理。