主页面,则执行主页面对应的事件处理程序
return mainmenuwnd_handleevent(&pme->mainmenu, ecode, wparam, dwparam);
……
default:break ;
}
该种方案的特点是较为利于理解,但是使用时容易出错,不宜调试。
3.2 类多态的brew页面迁移方案
经过上述分析可以看出,手机中的页面迁移问题与c++中实现的多态效果十分相似,也就是完成一个窗体接口类的实现, 该接口类能完成绘制屏幕和接收客户键盘输入的功能,对于客户的相同输入, 不同的窗体结构应该能体现出不同的行为。如果可以利用c语言这种非面向对象的语言写出面向对象的程序,将有利于提高程序的重用性、模块化功能以及健壮性。
brew平台中的宏qinterface,get_pvtbl,declare_vtbl可以用来完成这种效果。其本质就是在基类的层次上定义一个“空函数集”,通过该空函数集实现一个抽象的,虚拟的,通用的接口层,可以在运行时根据对象的实际类型动态地调用派生类的那些“具体”函数,简言之,就是同一个接口函数,根据具体的对象,调用具体的函数。
使用时首先通过qinterface定义了一个包含vtbl(虚函数表)的接口,在运行时,根据具体传入的对象类型调用了具体派生接口的“具体”函数。如:#define iwindow_enable(p)get_pvtbl(p, iwindow)->enable(p, true)这里p是iwindow指针类型。用户调用iwindow_enable(p)时,虽然此时传入的是iwindow类型指针,但是其实质是派生的具体接口类型,所以最终调用到的就是属于它(派生具体接口)的具体接口函数了。
以下代码用于完成一个满足上述要求的页面迁移过程。
typedef struct _iwindowiwindow;
qinterface(iwindow)
{
void (*enable)(iwindow * po, boolean benable);
void (*redraw)(iwindow * po);
boolean(*handleevent)(iwindow * po, aeeevent ecode, uint16 wparam, uint32 dwparam);
……
};
#define iwindow_enable(p) get_pvtbl(p, iwindow)->enable(p, true)
…
#define iwindow_redraw(p) get_pvtbl(p, iwindow)->redraw(p)
#define iwindow_handleevent(p, e, w, dw) get_pvtbl(p, iwindow)->handleevent(p, e, w, dw)
……
#define inherit_cwindow(iname)
declare_vtbl(iname)
ishell * m_pishell;
idisplay * m_pidisplay;
struct cwindow
{
inherit_cwindow(iwindow);
};
具体实现的功能如图1所示:
上述代码实现了一个结构体cwindow,其中包含三个成员,一个是指向函数表结构体类型的指针vtiwindow,另两个是普通成员指针。要通过指针vtiwindow访问函数的话,则只需要创建对应接口的函数表的实例,把接口实例的对应的函数表保存起来,然后用修改过的函数表结构体替换到接口之中,当调用对应的接口函数的时候, 就具有了特殊定义的行为。
通过上述工作,已经得到了一个窗体的基接口类,在其基础上可以派生自己的接口类来构造不同的窗体。并在派生接口类窗体中增加自己的数据成员,也可以增加接口行为,这样,就可以构造出负责各种功能的窗体来满足移动应用的需要。如图2所示。
4 结束语
文中针对手机开发的具体问题提出相应的解决方案,该方案均是在brew手机实际开发中总结出来的。这些方法和框架代码具有很大的可重用性,很好的解决了在brew手机开发中频繁出现的页面迁移问题,有一定现实意义。
参考文献
[1]唐际宇,杨永田,王骥.brew平台内部接口机制的探讨[j].航空电子技术, 2006(3).
上一页 [1] [2]