详解Brew中Widget实现分析

移动开发
Brew中Widget实现分析是本文要介绍的内容,主要是来了解并学习Widget应用的内容,具体内容的实现来看本文详解。

Brew中Widget实现分析是本文要介绍的内容,主要是来了解并学习Widget应用的内容,具体内容的实现来看本文详解。

一、WidgetBase及其作用

1、结构体的定义

  1. struct WidgetBase {  
  2.    const AEEVTBL(IWidget) *pvt;  
  3.    int               nRefs;  
  4.    IModule *         piModule;  
  5.    WExtent           extent;  
  6.    IContainer *      piContainer;  
  7.    IModel *          piModel;  
  8.    HandlerDesc       hd;  
  9.    PFNHANDLER        pfnDefHandler;     
  10.    // view model  
  11.    IModel *          piViewModel;  
  12. }; 

2、各字段的说明

详解Brew中Widget实现分析

3、该结构体定义了所有widget公用的数据成员。当然也提供了公用的函数,如WidgetBase_XXX等函数群。具体的widget 的实现类,都以该结构体作为第一个成员。

二、ContainerBase及其作用

1、container的简单说明

widget的容器,而container又可以看作是一种特殊的widget。这里就是一个composite模式。

2、WidgetNode

Container中的所有widget的相关信息放在一个双向链表中。链表的节点的定义如下:

  1. struct WidgetNode {  
  2.    WidgetNode *   pNext;  
  3.    WidgetNode *   pPrev;  
  4.    IWidget *      piWidget;  
  5.    AEERect        rc;  
  6.     // if non-null, then this widget is raised  
  7.    IXYContainer * pixyRaise;   // xy container that widget is raised to  
  8. #if defined(OPTIMIZ3)  
  9.    AEERect        rcDraw;  
  10. #endif  
  11.    flg            fVisible : 1;  
  12.    flg            fDraw : 1;  
  13. }; 

pNext,pPrev构成了双向链表;piWidget就是容器中的一个widget的指针;rc代表了该widget的位置,及大小。

对容器的操作,如添加widget,删除widget,查找widget,遍历所有的widget等,都映射为对该链表的操作。

3、结构体定义

  1. struct ContainerBase  
  2. {  
  3.    AEEVTBL(IContainer) *   pvt;  
  4.    uint32                  nRefs;  
  5.    IModule *               piModule;  
  6.    IModel *                piModel;  
  7.    WExtent                 extent;  
  8.    IContainer *           piParent;  
  9.    IWidget                 widget;  
  10.    AEEVTBL(IWidget)        vtWidget;  
  11.    Border                  border;  
  12.    IModel *                piViewModel;  
  13.    HandlerDesc             hd;  
  14.    PFNHANDLER              pfnDefHandler;  
  15.    WidgetNode              head;  
  16.  …  
  17. }; 

4、字段说明

摘抄的代码如下:  

  1. int ContainerBase_QueryInterface(IContainer *po, AEECLSID id, void **ppo)  
  2. {  
  3.    if ((id == AEEIID_WIDGET)  
  4.        || (id == AEEIID_HANDLER)) {  
  5.       *ppo = &me->widget;  
  6.       ICONTAINER_AddRef(po);  
  7.       return SUCCESS;  
  8.    }  

当客户通过该指针调用IWidget接口的方法时,

  1. (*(IWidgetVtbl**)(void*)ptr)->AddRef(); 

*ptr为字段pvt的值,即指向IWidgetVtbl结构体的指针。上述语句只不过是添加了强制类型转换。

通过这里我们可以清楚地了解到,把IContainer当作是普通的widget来看待时,它和该container里有多少个widget并没有关系,并且也不是其中的任何一个widget。

注1:其实QueryInterface的意思就是object-oriented中的“is-a”的关系,即继承关系,而按照object-oriented的原则,is-a是比has-a强得多的关系,所以如果可能的话,推荐使用get,set函数来表达has-a的关系。

注2:其实普通的接口指针,如 IWidget * , IContainer * 等,都是指向虚函数表的2级指针。因为是2级指针,增加了相当的灵活性(还记得那著名的添加一个间接层的名言吗)。

5、Draw函数

当显示Container时,container会遍历所有的widget,并调用IWIDGET_Draw函数完成显示操作

  1. Widget1   
  2.  
  3. Container(wid2, wid3)  
  4. Widget3    
  5. Container( 0x11111111 )  
  6. IWidget( 0x22222222 ) 

三、Decorator的实现方法

1、说明

Decorator是一种特殊的container,它管理并且只管理一个widget。它向该widget添加更多的UI功能

2、结构体

  1. struct WidgetContBase {  
  2.    WidgetBase     base;  
  3.    IContainer     container;  
  4.    AEEVTBL(IContainer) vtContainer;   
  5. };  
  6. struct Decorator {  
  7.    WidgetContBase    base;  
  8.    IWidget *         pChild;  
  9. }; 

3、结构体说明

摘抄的代码如下:

  1. int WidgetContBase_QueryInterface(IWidget *po, AEECLSID clsid, void **ppo)  
  2. {  
  3.    WidgetContBase *me = (WidgetContBase*) po;  
  4.      
  5.    if (clsid == AEEIID_CONTAINER) {  
  6.       *ppo = (void *)&me->container;  
  7.       WidgetBase_AddRef((IWidget*)po);  
  8.       return SUCCESS;  
  9.    }  
  10.    return WidgetBase_QueryInterface(po, clsid, ppo);  

可以看出:

IContainer本身是一个container,但是可以把它作为widget来看待。

IDecorator本身是一个widget,但是可以把它作为container来看待。

4、如果IDecorator已经wrap了target widget的话,那么调用ICONTAINER_GetWidget可以得到target widget。

IROOTCONTAINER_GetFirstWidget返回最先被加入的widget。

IROOTCONTAINER_GetLastWidget返回最后被加入的widget。

小结:详解Brew中Widget实现分析的内容介绍完了,希望通过Widget内容的学习能对你有所帮助。

责任编辑:zhaolei 来源: 互联网
相关推荐

2010-07-13 09:02:19

Widget开发

2011-09-09 20:14:58

Android Wid

2011-09-07 13:18:40

Android Wid

2011-09-07 16:43:38

Qt Widget

2011-09-07 10:34:48

Android Wid

2011-09-07 16:28:46

QT WidgetQWidget

2011-09-13 15:35:40

Widget

2011-02-28 13:04:27

RelativeLayAndroid Wid

2011-09-08 13:11:07

Android Wid实例

2011-09-07 16:24:10

Qt Widget

2011-09-08 10:04:07

Windows MobWidget

2011-09-07 14:55:28

Android WidAppWidget事件

2010-04-23 11:21:05

Widget开发

2010-05-13 10:19:09

Widget开发

2011-09-08 14:05:19

WidgetFlexViewer

2011-09-07 13:30:48

Android WidTabWidget

2011-09-09 16:38:51

Android Wid源码

2011-09-07 13:06:04

Android Wid

2011-09-07 14:20:42

Android Wid组件

2011-09-07 14:34:55

Android Wid控件
点赞
收藏

51CTO技术栈公众号