现在的位置: 首页 > 综合 > 正文

菜单控件使用心得和理解

2018年05月08日 ⁄ 综合 ⁄ 共 2010字 ⁄ 字号 评论关闭

首先是REFERENCE:

  1. 调用 ISHELL_CreateInstance() 创建文本控件实例。
  2. 调用 ITEXTCTL_SetRect() 指定包含文本控件的屏幕矩形。
  3. 指定屏幕矩形后,调用 ITEXTCTL_SetTitle() 或 ITEXTCTL_SetText() 指定控件的标题及控件的文本字符串初始值。
  4. 调用 ITEXTCTL_SetProperties() 设置文本控件属性。
  5. 调用 ITEXTCTL_SetSoftKeyMenu() 指定与该文本控件关联的软键菜单
    (如果有)。
  6. 调用 ITEXTCTL_SetActive() 激活文本控件并在屏幕上显示其内容。
  7. 文本控件激活时,调用 ITEXTCTL_HandleEvent() 向它传递用户生成的所有按键事件。
  8. 当设备用户完成文本输入时,调用 ITEXTCTL_GetText() 或 ITEXTCTL_GetTextPtr() 获取设备用户输入的文本(如果使用软键菜单,设备用户可以使用菜单中的“完成”项指示文本输入结束,如果没有软键菜单则可以按“选择”键或其它键)。
  9. 如果不再需要文本控件,调用 ITEXTCTL_Release() 将其释放。、

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有两种方式被调用。一种是在applethandleevent中由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会自动的调用处于focuscontrolhandleevent来处理该事件,只有当该control没有处理该事件时,dialog注册的事件处理函数才会被调用。
Brew
中的handle event函数都是boolean返回类型的,这是为了实现事件处理的层次机制,当该层上的handle event没有处理该事件时,应该返回false,以便上层对该事件感兴趣的handle event来处理。 如果处理了,应该返回TRUE,说明该事件已被处理,无需其他层再处理。

对照我们的示例代码,可以更深刻的理解Brew消息处理机制。

(完)

抱歉!评论已关闭.