PainterEngine对象管理机制

概述

在开始PainterEngine UI设计之前,我们先预先了解下PainterEngine的对象管理机制.

 

简单来说,PainterEngine,PainterEngine的所有控件(例如按钮,滑动条,编辑框)都是PainterEngine的对象

 

 

1.       PainterEngine的对象由一个PX_Object来描述

2.       PainterEngine的对象,可以互为父子关系,没有父对象的对象,称为根对象,否者为某一对象的子对象

3.       父对象不可见,子对象也不可见,父对象无效,子对象也无效,父对象收到的消息,会逐一投递给自己的子对象

 

为了方便理解,以下面的试图做个举例

上面是一个计算器程序,我们可以说,计算器是一个窗口构成,窗口是一个根对象,而窗口中的所有数字按钮,是窗口的子对象,如果窗口关闭了,所有的数字按钮,也随之关闭

 

创建对象

示范,创建一个PainterEngine根对象

1.       首先,我们定义一个对象类型 PX_Object *root;

2.       创建这个对象 root=PX_ObjectCreate(内存池,PX_NULL(父对象),0(x坐标),0(y坐标),0(z坐标),0(宽度),0(高度),0(长度));

 

下面,我们创建一个按钮对象按钮对象,并连接到这个根对象上

button=PX_Object_PushButtonCreate(内存池,PX_NULL(父对象),100(x坐标),100(y坐标),200(宽度),32(高度),"hello PainterEngine"(按钮的文本),PX_NULL(字模));

 

渲染对象

在创建好对象之后,你应该将这个对象绘制(渲染)出来,PainterEngine,使用PX_ObjectRender来渲染对象,如果有多个对象,一般情况下我们只要渲染根对象就可以了,根对象渲染时会渲染所有它的子对象

 

例如在上面的例子中,我们应该在PX_ApplicationRender函数中渲染root对象

px_void PX_ApplicationRender(PX_Application *pApp,px_dword elpased)

{

         px_surface *pRenderSurface=&pApp->runtime.RenderSurface;

         PX_RuntimeRenderClear(&pApp->runtime,PX_OBJECT_UI_DEFAULT_BACKGROUNDCOLOR);

         PX_ObjectRender(pRenderSurface,root,elpased);

}

 

投递消息

在创建并渲染好对象后,我们需要通知对象当前的鼠标/键盘/触摸屏….当前的状态和变化,这样,按钮,滑动条….等一系列对象,才能根据输入的信息进行处理,PainterEngine,使用PX_ObjectPostEvent来投递消息, 如果有多个对象,一般情况下我们只要将消息投递给根对象就可以了,根对象收到消息时会将消息通知所有它的子对象

 

例如在上面的例子中,我们应该在PX_ ApplicationPostEvent函数中将消息投递给root对象

px_void PX_ApplicationPostEvent(PX_Application *pApp,PX_Object_Event e)

{

         PX_ApplicationEventDefault(&pApp->runtime, e);

         PX_ObjectPostEvent(root,e);

}

 

最终,你将得到一个有按钮的程序

其它常用函数

1.       使用PX_ObjectDelete来删除一个对象

2.       你可以通过Object->Visible=PX_TRUE/PX_FALSE或者PX_ObjectSetVisible来设置一个对象是否可见

3.       你可以通过Object->Enabled=PX_TRUE/PX_FALSE或者PX_ObjectSetVisible来设置一个对象是否可用,如果这个对象EnabledPX_FALSE,它将不响应任何消息