首先是REFERENCE:
(如果有)。
NEED: AEEText.h
接下来简单介绍下我的示例代码结构:
Init(pMe); 放置于EVT_APP_START 事件的处理中,作一个初始化;在APPLET结构中增加一个(ITextCtl *)类型pCtl指针;
reference的1-6步均在INIT函数中实现(步骤5省略);
编写代码遇到的主要问题就是在事件处理的安排上。
根据第7条,我们应该调用ITEXTCTL_HandleEvent()向它传递用户生成的所有按键事件;那么 在哪里调用它呢?
如果按键事件不能够正确的传递,那么事件处理也就无从谈起,即使正确的编写了事件处理的代码也没办法得到执行。
我们知道,按键会产生EVT_KEY消息发送到APPLET中;那么除了个别我们感兴趣的键(如AVK_SELECT),其余的键消息我们都可以让它们落入switch循环的default当中,那么要使按键消息得到正确的处理,就要在这里调用itextctl_handleEvent()。
具体代码:
default:
if(pMe->pCtl)
{
if(ITEXTCTL_HandleEvent(pMe->pCtl,EVT_KEY,wParam,dwParam))
return TRUE;
}
步骤8我们在AVK_SELECT的消息处理中实现;在GETTEXT之后,因为我们已经不再需要文本控件,所以迅速调用Release将其释放,这样也就完成了步骤9。
我们通过这样一个简单的例子,走完了reference中的全部步骤,也成功的实现了一个ITEXTCTL的应用。结合下面的文档:
除了IAPPLET具有handleevent外,所有的继承Icontrol接口的Interface也具有事件处理函数,允许处理事件。这些各种具体的Icontrol_handleevent有两种方式被调用。一种是在applet的handleevent中由programmer显式的调用,如:
switch (eCode)
{
case EVT_APP_START:
………
return(TRUE);
case EVT_APP_STOP:
……….
Case EVT_KEY:
IMENU_Handleevent….
ItextCtl_Handleevent….
另一种是当这些Control包含于Dialog中,且处于focus状态时,这些事件处理函数的触发是隐式的,是由AEE机制自动触发的,无需在代码中显式的调用这些handleEvent。
Idialog接口没有外露的handleevent接口函数,但是允许通过Idialog_seteventhandle来注册一个该Dialog的事件处理函数。需要注意的是,该事件处理函数是何时被触发的:一旦当一个dialog处于active时,aee shell将会把所有的event直接发往该dialog,该dialog会自动的调用处于focus的control的handleevent来处理该事件,只有当该control没有处理该事件时,dialog注册的事件处理函数才会被调用。
Brew中的handle event函数都是boolean返回类型的,这是为了实现事件处理的层次机制,当该层上的handle event没有处理该事件时,应该返回false,以便上层对该事件感兴趣的handle event来处理。 如果处理了,应该返回TRUE,说明该事件已被处理,无需其他层再处理。
对照我们的示例代码,可以更深刻的理解Brew消息处理机制。
(完)