![](https://csdnimg.cn/release/download_crawler_static/9423780/bg5.jpg)
new_object->type = object_type;
rtgui_type_object_construct(object_type, new_object);// 递归的调用各个类的构造函数
return new_object;
}
void rtgui_type_object_construct(const rtgui_type_t *type, rtgui_object_t *object)
{
if (type->parent != RT_NULL) /* first call parent's type */
rtgui_type_object_construct(type->parent, object);
if (type->constructor) type->constructor(object);
}
所以整个过程将依次调用
_rtgui_object_constructor,
_rtgui_widget_constructor,
_rtgui_container_constructor
_rtgui_win_constructor
最终将创建一个 rtgui_win 对象
2. 事件 event 对象
详细说一下基类 rt_event
struct rtgui_event
{
enum _rtgui_event_type type; /* the event type */
rt_uint16_t user; /* user field of event */
rt_thread_t sender; /* the event sender */
rt_mailbox_t ack; /* mailbox to acknowledge request */
};
第一项枚举型变量 type 表示了该事件的类型,一般在初始化事件时就会指定好,所有的 event
枚举类型在 event.h 文件中都可以找到
第二项事件的私有数据。
第三项指明此事件的发送者是由哪个线程发送的。
第 四 项 一般用 于 服 务 器 接 收 到 客 户 端 的 某 些 请 求 所 作 出 应 答 。 例 如 当 服 务 器 收 到
RTGUI_EVENT_WIN_CREATE 事件,在作出相应的处理后,便会调用 rtgui_ack,跟踪进去就会
发现实际上是服务器向该事件所指定的邮箱发送了一封应答邮件。
case RTGUI_EVENT_WIN_CREATE:
if (rtgui_topwin_add((struct rtgui_event_win_create *)event) == RT_EOK)
rtgui_ack(event, RTGUI_STATUS_OK);