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

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

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

Brew中Widget實(shí)現(xiàn)分析是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Widget應(yīng)用的內(nèi)容,具體內(nèi)容的實(shí)現(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實(shí)現(xiàn)分析

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

二、ContainerBase及其作用

1、container的簡單說明

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

2、WidgetNode

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

  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就是容器中的一個(gè)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.    }  

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

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

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

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

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

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

5、Draw函數(shù)

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

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

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

1、說明

Decorator是一種特殊的container,它管理并且只管理一個(gè)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本身是一個(gè)container,但是可以把它作為widget來看待。

IDecorator本身是一個(gè)widget,但是可以把它作為container來看待。

4、如果IDecorator已經(jīng)wrap了target widget的話,那么調(diào)用ICONTAINER_GetWidget可以得到target widget。

IROOTCONTAINER_GetFirstWidget返回最先被加入的widget。

IROOTCONTAINER_GetLastWidget返回最后被加入的widget。

小結(jié):詳解Brew中Widget實(shí)現(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-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實(shí)例

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壓縮使用性能分析
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 天天操天天拍 | 欧美一区二区三区,视频 | 日韩av免费在线观看 | 日韩在线精品强乱中文字幕 | 一级毛片高清 | 久干网| 日本在线看 | 亚洲电影一级片 | 欧美激情视频一区二区三区免费 | 99久久婷婷国产亚洲终合精品 | 国产一区二区三区四区五区3d | 国产精品视频免费观看 | 日韩在线中文字幕 | 91九色在线观看 | 久久99精品久久久久久 | 成人片网址| 国产精品亚洲一区 | 久热精品免费 | 午夜精品一区二区三区在线 | 国产免费va | 欧美日韩在线综合 | 欧美日韩一本 | 日韩欧美国产一区二区 | 91精品国产欧美一区二区 | 日韩在线成人 | 久久久久九九九女人毛片 | 婷婷成人在线 | 亚洲精品一区二区三区中文字幕 | 日韩在线免费看 | 一本综合久久 | 99热首页| 在线视频中文字幕 | 97视频成人 | www.日本在线观看 | 在线91 | 高清黄色网址 | 国产成人精品午夜视频免费 | 日本高清视频在线播放 | 国产精品美女在线观看 | 日本高清视频在线播放 | 精品乱码久久久久 |