一,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...