Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3464060
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: C/C++

2009-07-02 17:58:39

一:处理按键事件

   当用户按下某个按键时,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定义,代表按键的键码。

阅读(979) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~