RT-Thread GUI Object
RT-Thread GUI 物件架構
在 RTGUI 中,最小的物件為 widget,再來是 window,window 也是一個 widget;而每個 widget 也是一個 object,這是為了仿造 C++ 的物件導向所設計的,相同的概念我們在 RT-Thread 中已經看過許多次了,在 GUI engine 中也是相同的設計,其中在 object 結構中又串在 type 的結構上,type 中定義了兩個函式:constructor
與 destructor
,在 C++ 的 class 中,常使用 init
函式來初始化新建的 class,這裡的 constructor
與 destructor
即用來初始化新建立的物件,及在刪除物件時,釋放該釋放的記憶體。
結構
定義物件類型
RTGUI 設計了一個巨集函數來定義不同的物件,如下:
##
為連字符,在RT-Thread 理解 RTM_EXPORT裡有提過了,基本上就是填入值進去結構體
建立物件
rtgui_object_create
建立物件相當簡單,透過欲建立的物件類型所定意義的 construct
函數來建立,其中 rtgui_type_object_construct
會呼叫正確的建立函式來初始化資料。
rtgui_type_object_construct
功能 |
回傳值 |
呼叫正確的 construct 函式來初始化物件 |
void |
*type |
*object |
欲初始化的物件類型 |
物件本體 |
如果欲建立的物件類型在某一個物件類型的底下,如 window 之於 widget,則先呼叫在上層的 construct
;接著呼叫自己的 construct
來完成建立的動作。
再仔細的看一下 "object" 的 construct
函式,其動作為:填入 vaild 的旗標,並將 id 填入 object 的記憶體指標;以上動作在 _rtgui_object_constructor
完成
_rtgui_object_constructor
功能 |
回傳值 |
"object" 建立函式 |
void |
刪除物件
rtgui_object_destroy
這裡一樣透過 rtgui_type_destructors_call
來呼叫正確的 destruct
函式,destruct
負責釋放該釋放的記憶體;最後透過 rtgui_free
釋放整個物件。regui_free
則簡單的呼叫 rt_free
釋放記憶體,我們在前幾篇文章有討論過了(mempool、memheap、small mem、slab)
rtgui_type_destructors_call
功能 |
回傳值 |
呼叫正確的 destructor 函式來清除物件 |
void |
*type |
*object |
欲清除的物件類型 |
物件本體 |
同樣的如果此物件類型是在某個物件類型的底下,先呼叫上層的 destruct
;接著呼叫自己的 desturct
完成清除的動作。
最後來看一下 "object" 的刪除函式:填入 none 的旗標,並將物件種類設為 NULL;動作在 _rtgui_object_destructor
完成
_rtgui_object_destructor
功能 |
回傳值 |
"object" 的刪除函式 |
void |