RootForm对form的关于及RootContainer对IWidget的管理和事件处理

来源:互联网 发布:正规淘宝客服要交钱吗? 编辑:程序博客网 时间:2024/06/11 21:08

大家每次在做调试的时候会发现栈会很深,大部分都是在buiw中,初看似乎很复杂,但是如果真正了解流程了,也就没有那么复杂了,现就对自己了解的做以阐述,也请大家指正。

先从RootForm的创建开始,RootForm中创建了相关的Display,RootContainer,还有一个很重要的东西就是Form的piwidget,piwidget是从RootContainer中查询出来的,还创建了相应的VectorModel。rootContainer是用来管理插入到rootForm中的Form的WIdget的,VectorModel是用来管理form的。Display其实创建的也是每个app的display,每个应用都有自己的一个RootForm。

  将Form插入到rootForm中主要会做两步操作,第一:将Form添加到vectorModel中。第二:将每个Form中的Widget放到RootContainer中,具体做法就是利用IForm_getWidget(pIForm,WID_Form,&piwidget);IRootContainer_insert(....).

从RootForm中remove一个form就是添加的相反操作了。

再来看事件处理,在rootForm_handleEvent中有这么一句:IWIDGET_HandleEvent(FORM_WIDGET(me), evt, wParam, dwParam)这一句也就标志了RootForm首先去处理了控件的事件,那这个事件又是怎样去调用的呢,FORM_WIDGET(me)其实就是rootform中form的piwidget指针,那这个指针是在什么时候赋值的呢,在刚开始rootform创建的时候:IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)&me->base.piWidget),这样就把这样一个指针和rootContainer联系起来了,其实IWIDGET_HandleEvent这个事件就是去调用了rootContainer的Handle然再有rootContainer再去找它里面相对应的控件,也许这个rootContainer放的还是一个Container的一个widget指针,那就又会到ContainerBase的指针,再找里面的控件,直到找到真正的widget为止。

原创粉丝点击