BREW应用是基本消息驱动的,当Applet载入后,它能通过消息来获取用户输入,这是通过Applet的HandleEvent函数来完成的。
发送给Applet的消息
因为BREW是一个消息驱动的环境。它要求消息能够及时被处理。这意味着Applet必需快速处理消息然后返回。在BREW中,在消息处理中一定时间的延迟可能导致Applet的退出以保护设备的正常运行。
当BREW将消息发送给Applet后,Applet通过在事件处理函数中返回TRUE(表示处理),FALSE(表示不处理)。当Applet必需将该事件发送给其它的事件处理函数时(比如控件),可以直接返回该事件处理函数。
Apple接收三个与事件处理相关的参数,分别作为事件处理函数HandleEvent的第二、第三、第四个参数。下面是一个事件处理函数的定义:
boolean HandleEvent(IApplet * pIApp, AEEEvent eCode, uint16 wParam,
uint32 dwParam)
第二个参数为AEEEvent事件类型,指明了Applet收到主事件类型。比如:EVT_APP_START, EVT_APP_STOP以及告警事件,可以参考BREW API查看全部的事件类型。
第三和第四分别为16位和32位与事件相关的数据,这些值是与具体的事件相关的。
关于事件处理的几点提示
在开发一个Applet时,只考虑和处理Applet需要处理的那些事件,通常情况下,你可以忽略大多数的事件。比如,开发一个游戏,只需要上、下、左、右、选择键作为输入,而对应的键盘处理再接收到数字键时可以返回FALSE以使它们获得缺省的BREW事件处理。
某些事件只有在Applet指明需要接收这些通知时才会发送到Applet。而关键事件在任何情况是不能被Applet忽略的,如EVT_APP_START, EVT_APP_STOP。注意在某些特定状态下收到这些关键事件的处理方法,Applet必需能够保存数据及上下文。
键盘事件发送给Applet的事件是EVT_KEY,16位参数指明了键值,键值是以unicode的方式发送的。参考BREW API查看全部的键值及符号。
例如,按下数字键2时,16位短参数包含了与字符2对应的unicode值,这使得在Applet中可以处理一个击键事件,使用设备配置器,可以修改设备发送给Applet的键值,设备OEM制造商决定了目标设备的键值定义。
当一个按下或释放时,IShell将向处于活动状态的Applet发送异步事件,下面列出了一个Applet可以接收到的击键事件及其描述:
键盘事件 | 描述 |
EVT_KEY_PRESS | 当按下键时Applet接收到此事件,参数为:
|
EVT_KEY_RELEASE | 当键被释放时Applet接收到此事件,参数为:
|
EVT_KEY | 在按下键或键被释放时发送,或者两种情况都发送,这取决设备制造商的选择,Applet应该在这个事件中处理键盘事件。因为不同的设备具体不同的键盘设置,在开发时应该在这些规范下编程。参数为:
|
BREW中处理Tab事件
在对话框中通过方向键来移动光标的方向取决于哪种控件具有焦点以及用户按了哪个方向(上、下、左、右)键。Tab方向,后面称为前移、后移Tab事件,取决于如何在代码和资源文件中如何设计。一种好的设计是将控件按其ID值大小顺序排列(从上到下,从左到右)。以这种方式对控件进行布局,当收到前移、后移Tab事件,光标将在控件以一种合乎逻辑的方式移动。在进行手工处理Tab事件最好也选择这种方式。
下面表格中的Menu控件发送EVT_CTL_TAB事件:
Menu控件 | 发送Tab事件 |
Soft Key | Up = backward Down = forward |
Menu | Left = backward Right = forward |
List | Left = backward Right = forward |
Date | Left = backward Right = forward |
Time | Left = backward Right = forward |
Static(允许处理Tab事件时) | 在文本开头,Up = backward 在文本结尾,Down = forward |
注意:如果光标在多行文本的最后一行最后一个字符位置,此时如果按向下键,则会在多行文本中插入一个换行符,如果光标在多行文件的最后一行但不是最后一个字符位置时,此时如果按向下键而且有一个Soft Key时,此时不会发送EVT_CTL_TAB事件,而Soft Key 将获得焦点。