BREW的Widget實現分析(一)

2021-04-12 22:51:38 字數 3468 閱讀 1852

一,widgetbase及其作用

1,結構體的定義

struct widgetbase ;

2,各字段的說明

欄位名

說明

pvt

虛函式表的指標

nrefs

引用計數

pimodule

所屬的module的指標

extent

widget的大小,寬度,高度

picontainer

widget所屬container的指標

pimodel

widget為根據mvc模型而作的,model的指標

hd

在該widget上有event發生時,呼叫該處理函式。

pfndefhandler

預設的event處理函式

piviewmodel

3,該結構體定義了所有widget公用的資料成員。當然也提供了公用的函式,如widgetbase_***等函式群。具體的widget 的實現類,都以該結構體作為第乙個成員。

二,containerbase及其作用

1,container的簡單說明

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

2,widgetnode

struct widgetnode ;

pnext,pprev構成了雙向鍊錶;piwidget就是容器中的乙個widget的指標;rc代表了該widget的位置,及大小。

對容器的操作,如新增widget,刪除widget,查詢widget,遍歷所有的widget等,都對映為對該鍊錶的操作。

3,結構體定義

struct containerbase

;4,字段說明

字段

說明

pvt

指向icontainer的虛函式表

從nrefs 到

piparent,

及hr和

pfndefhandler

同widgetbase的意義完全相同,因為要把container看作乙個普通的widget

widget

iwidgetvtbl *pvt ; 指向結構體的下乙個欄位vtwidget;

就是通過這乙個虛函式表,是該

container

可以被認為是乙個普通的

widget

。當呼叫

icontainer_queryinte***ce( iwidget )

時,返回該指標的位址。

containerbase * pme ; 其實就是this指標

vtwidget

widget的虛函式表,通過該錶,使container可以被認為是乙個普通的widget。

head

包含的widget組成的鍊錶

摘抄的**如下:

int containerbase_queryinte***ce(icontainer *po, aeeclsid id, void **ppo)

}當客戶通過該指標呼叫iwidget介面的方法時,

(*(iwidgetvtbl**)(void*)ptr)->addref();

*ptr為字段pvt的值,即指向iwidgetvtbl結構體的指標。上述語句只不過是新增了強制型別轉換。

通過這裡我們可以清楚地了解到,把icontainer當作是普通的widget來看待時,它和該container裡有多少個widget並沒有關係,並且也不是其中的任何乙個widget。注1

:其實queryinte***ce

的意思就是

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函式完成顯示操作

widget1

container(wid2, wid3)

widget3

icontainer( 0x11111111 )

iwidget( 0x22222222 )

三,decorator的實現方法

1,說明

decorator是一種特殊的container,它管理並且只管理乙個widget。它向該widget新增更多的ui功能

2,結構體

struct widgetcontbase ;

struct decorator ;

3,結構體說明

字段

說明

base

說明該元件是乙個普通的widget

container

icontainervtbl *pvt ; 指向結構體的下乙個欄位vtcontainer;

就是通過這乙個虛函式表,是該

decorator

可以被認為是乙個

container

。當呼叫

idecorator_queryinte***ce( icontainer )

時,返回該指標的位址。

widgetcontbase * pme ; 其實就是this指標

vtcontainer

container的虛函式表,通過該錶,是widget(decorator)可以被認為是乙個container。

pchild

被decorated的target widget。

摘抄的**如下:

int widgetcontbase_queryinte***ce(iwidget *po, aeeclsid clsid, void **ppo)

return widgetbase_queryinte***ce(po, clsid, ppo);

}可以看出:

icontainer本身是乙個container,但是可以把它作為widget來看待。

idecorator本身是乙個widget,但是可以把它作為container來看待。

4,如果idecorator已經wrap了target widget的話,那麼呼叫icontainer_getwidget可以得到target widget。

irootcontainer_getfirstwidget返回最先被加入的widget。

irootcontainer_getlastwidget返回最後被加入的widget。

YII框架分析筆記7 掛件widget

widget好處是方面重用和靈活移動。cwidget是所有的widge父類,同時它又是是cbasecontroller的子類,cwidget提供了類似ccontroller中的一些方法,但render 方法渲染的時候不帶layout,而且渲染的時候 this指得是cwidget物件,而不是ccont...

BREW應用的c 實現注意點

做過brew開發的都知道,不論是用iwindow還是statemachine,都是應用的c語言,而且編譯器也是採用的c編譯器,而對於具有優良思想的物件導向的c 語言卻應用的不多。其實brew開發是完全支援c 語言的。從vc6.0的偵錯程式來說吧,肯定支援c 語言了,對於arm或者gcc來說,也是有可...

Widget簡單的例子

模擬器效果圖 img color red onrecevie color 接收廣播事件 首先在res下面新建乙個資料夾 xml 在資料夾下新建 color olive example widget info.xml color 在layout資料夾下面新建乙個 color olive example...