成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Brew中Widget實現(xiàn)分析

移動開發(fā)
Brew中Widget實現(xiàn)分析是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Widget應(yīng)用的內(nèi)容,具體內(nèi)容的實現(xiàn)來看本文詳解。

Brew中Widget實現(xiàn)分析是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Widget應(yīng)用的內(nèi)容,具體內(nèi)容的實現(xiàn)來看本文詳解。

一、WidgetBase及其作用

1、結(jié)構(gòu)體的定義

  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實現(xiàn)分析

3、該結(jié)構(gòu)體定義了所有widget公用的數(shù)據(jù)成員。當然也提供了公用的函數(shù),如WidgetBase_XXX等函數(shù)群。具體的widget 的實現(xiàn)類,都以該結(jié)構(gòu)體作為第一個成員。

二、ContainerBase及其作用

1、container的簡單說明

widget的容器,而container又可以看作是一種特殊的widget。這里就是一個composite模式。

2、WidgetNode

Container中的所有widget的相關(guān)信息放在一個雙向鏈表中。鏈表的節(jié)點的定義如下:

  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構(gòu)成了雙向鏈表;piWidget就是容器中的一個widget的指針;rc代表了該widget的位置,及大小。

對容器的操作,如添加widget,刪除widget,查找widget,遍歷所有的widget等,都映射為對該鏈表的操作。

3、結(jié)構(gòu)體定義

  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.    }  

當客戶通過該指針調(diào)用IWidget接口的方法時,

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

*ptr為字段pvt的值,即指向IWidgetVtbl結(jié)構(gòu)體的指針。上述語句只不過是添加了強制類型轉(zhuǎn)換。

通過這里我們可以清楚地了解到,把IContainer當作是普通的widget來看待時,它和該container里有多少個widget并沒有關(guān)系,并且也不是其中的任何一個widget。

注1:其實QueryInterface的意思就是object-oriented中的“is-a”的關(guān)系,即繼承關(guān)系,而按照object-oriented的原則,is-a是比has-a強得多的關(guān)系,所以如果可能的話,推薦使用get,set函數(shù)來表達has-a的關(guān)系。

注2:其實普通的接口指針,如 IWidget * , IContainer * 等,都是指向虛函數(shù)表的2級指針。因為是2級指針,增加了相當?shù)撵`活性(還記得那著名的添加一個間接層的名言嗎)。

5、Draw函數(shù)

當顯示Container時,container會遍歷所有的widget,并調(diào)用IWIDGET_Draw函數(shù)完成顯示操作

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

三、Decorator的實現(xiàn)方法

1、說明

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

2、結(jié)構(gòu)體

  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、結(jié)構(gòu)體說明

摘抄的代碼如下:

  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已經(jīng)wrap了target widget的話,那么調(diào)用ICONTAINER_GetWidget可以得到target widget。

IROOTCONTAINER_GetFirstWidget返回最先被加入的widget。

IROOTCONTAINER_GetLastWidget返回最后被加入的widget。

小結(jié):詳解Brew中Widget實現(xiàn)分析的內(nèi)容介紹完了,希望通過Widget內(nèi)容的學(xué)習(xí)能對你有所幫助。

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-07-13 09:02:19

Widget開發(fā)

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-13 15:35:40

Widget

2011-09-07 16:28:46

QT WidgetQWidget

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-05-13 10:19:09

Widget開發(fā)

2010-04-23 11:21:05

Widget開發(fā)

2011-09-07 13:30:48

Android WidTabWidget

2011-09-08 14:05:19

WidgetFlexViewer

2011-09-09 16:38:51

Android Wid源碼

2011-09-07 13:06:04

Android Wid

2011-09-07 14:20:42

Android Wid組件

2023-02-02 09:13:12

Hive壓縮使用性能分析
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区精品 | 色嗨嗨| www.五月天婷婷.com | 成人欧美一区二区三区在线播放 | 精品国产一区久久 | 国产一区亚洲 | 日韩2020狼一二三 | 久久久久无码国产精品一区 | 亚洲一区二区三区高清 | 精品在线播放 | 亚洲一区| 久久精品免费看 | 大学生a级毛片免费视频 | 欧美精品一区二区三区在线四季 | 精品欧美一区二区三区 | 99精品久久久久久 | www.久久 | 国产欧美一区二区精品久导航 | 国产一级片久久久 | 日韩中文电影 | 日韩蜜桃视频 | 国产一区二区精华 | av手机免费在线观看 | 蜜桃一区二区三区在线 | 国产中文字幕在线观看 | 国产一区2区| av日韩在线播放 | 91精品国产综合久久国产大片 | 亚洲国产激情 | 国产农村一级国产农村 | 黄色大片免费观看 | 五十女人一级毛片 | 美女视频一区二区三区 | 亚洲精品欧美精品 | 欧美日韩一区二区三区四区五区 | 国产 日韩 欧美 中文 在线播放 | www.久草.com | 玖玖综合在线 | 在线 丝袜 欧美 日韩 制服 | 日韩久久久久久 | 日韩欧美在线一区 |