偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

移動開發(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-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實(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ù)棧公眾號