BUIW的基本框架如下图,这幅图是比较完整的一个结构,ROOTForm通过一个VectorModel管理所有Forms;通过一个RootContainer管理所有Rootform上的widgets和其它form的piwidget成员(XYContainer类型,其它所有Forms都通过自己的piwidget管理自己的子container或子widget)。
插入一个新的Form的过程(RootForm_InsertForm):
1. 分别找到新Form和对应piwidget在piForms和piWidget中的位置。
2. 分别把Form插入piForms和piContainer。
3. 更新FormStack,包括:
(1) 设置最顶层Form为Active状态
(2) 所有其他Forms设为not Active状态
(3) 设置ActiveForm侦听函数
(4) 设置最上面的非POPUP Form侦听函数
(5) 所有popup Forms和最上面的非PopUpForms需要显示,把它们的piwidgetàbShow标志位都置为1
(6) 其它Forms不必显示,把它们的piWidget->bShow标志位都清零
(7) 设置focus widget,设置过程是一个递归调用的过程,一直会设置到最上层form的最底层一个container最底层的widget。
(8) SoftKey Widget在最顶层Form的piWidget下面
(9) Title Widget在最上面的非PopUpForm下面,如果没有PopUp Forms,则为TopForm---SoftKeyWidget---TitleWidget
由上述插入过程基本可以看出整个BUIW的FORM---Contaienr---Widget的框架了。
下面再来看其消息处理流程:
(1) APP把消息传给ROOTForm,由RootForm_HandleEvent处理
(2) RootForm_HandleEvent首先查找当前widget处理,分两步:
l 如果此时RootForm指定了piwCapture,用该Widget处理该消息,piwCapture在设置touch的时候会指定好;
l 如果未指定piwCapture,则由当前focus widget处理。插入FORM过程中指定focus widget过程上面已经描述过了;
(3) 如果此时仍然没有被处理,则转给当前TOPForm处理
几个概念区分:
1. bactive是标志当前FORM是否active的标志位;最顶层form为active状态,另外,当APP处于激活状态时,rootform的bactive也为TRUE,而APP被挂起的时候rootform的bactive被置为FALSE。
rootform->piactivewidget指向当前topform的piwidget。
2. pFocus是每个container用来保存其子控件中的focus控件指针的变量。
3. piwCapture是RootForm用来保存支持触摸操作时当前操作的widget。