一个典型的应用界面如下图:
界面右侧,上方蓝框中是一个TabCtrl,下方红框是一个TabLayout布局,TabCtrl显示关联的功能页标题,下方TabLayout为功能页容器,每当创建一个功能页,TabCtrl就增加一项,TabLayout也增加一项容纳功能页。
因为希望能够在尽可能多的地方通过一个简单的函数创建功能页,所以需要把上述的TabCtrl、TabLayout以及功能页的创建在某处统一管理,接口ITranManager就是为了完成这个功能而定义的。
一个功能页,包含一个XML文件和一个C++类,XML为页面布局,代表VIEW,C++类为页面功能代码,代表MODLE,由于一个系统有很多功能,为方便管理,每个功能用一个字符串代表,这个字符串称为事务码,长度20位以内,大多是4位,比如VA01为销售订单。
当通过事务码创建功能页时,系统需要先根据对应的XML文件创建一个DuiLib的CControlUI类对象v,然后创建一个C++类的对象m,然后将v和m关联起来,也就是把v的消息通知转发给m,由m处理事件。
为了统一管理这些(v,m),定义了CDuiTranPageManager类。
CDuiTranPageManager实现了接口IPageControlManager
CDuiTranPageManager对象只需要一个,定义在应用的主窗口CMainFrame中,ITranManager也是由CMainFrame实现。之所以两者都放在CMainFrame中,是因为这两者都跟创建功能页有关,所以统一放在一个地方。
在CMainFrame::OnCreate函数中,生成了唯一的一个CDuiTranPageManager对象m_pDuiPageManager,并将ITranManager接口传递给了该对象。
功能页面的创建从代码结构上分为通过C++宏进行动态创建和普通的代码创建,两者本质上是一样的。通过C++宏的方式类似MFC中的动态创建机制;普通的代码创建,就是维护一个事务码到XML文件的映射表,创建页面时通过事务码找到对应的XML文件,根据XML文件创建对应的C++类对象,就是一个大的if-else代码段,这些由类CTrancodeManager管理,该类实现了接口ITrancodeManager。
因为一些核心的功能封装在了底层DLL中,所以需要定义一些接口,然后由上层应用实现这些接口。
参见页面创建。