读书人

金山界面库分析(七)

发布时间: 2012-10-18 13:46:55 作者: rapoo

金山界面库分析(7)

如何进行排版


前面我们分析过对于WM_SIZE消息的处理过程,CBkDialogViewImpl窗口类在处理WM_SIZE消息时,调用了自身的_RepositionItems方法,在这个方法内对窗口上的虚拟控件进行处理,现在我们来详细看一下控件体系内是如何进行排版操作的。

在_RepositionItems方法中定义了4个CRect变量,就是rcClient, rcHeader, rcFooter和rcBody,其中rcHeader,rcFooter和rcBody分别对应m_bkHeader,m_bkFooter和m_bkBody的位置,rcClient是rcHeader,m_bkFooter和m_bkBody之和。

在控件中哪些变量表示控件的位置信息呢:

在CBkWindow中,用m_rcWindow这个CRect类型的变量来表示每个控件的基本位置信息(控件的长宽以及左上角相对于实窗口的pos),用m_dlgpos这个BKDLG_POSITION类型的变量来表示从Xml获取的控件位置信息(相对于父控件的距离)。

CBkWindow类中的BKDLG_POSITION类型包含了控件上下左右的边界位置,而且可以表示控件边界相对于父控件边界是左对齐,右对齐还是居中对齐,以及具体的偏移量。

而在CBkWindow类中也设置了一系列的枚举值:


CBkWindow类负责自身的计算工作,所有控件的自身计算工作都是由调用父类CBkWindow的OnWindowPosChanged方法来进行的,在这个方法中通过xml描述和传入的父控件长宽计算自身大小,同时根据传入的pos设置控件的m_rcWindow。CBkDialog类计算自身,并计算其子节点的大小,设置子节点的pos并向其发送WM_WM_WINDOWPOSCHANGED消息,令其计算自身。

读书人网 >软件架构设计

热点推荐