第3节 Frame-Splitter-Splitter模型
除了主要采用各种类型视图的派生类作为分隔器的子窗口之外,框架类的派生类也可以作为分隔器的子窗口。利用这一点,就可以实现对分隔器内部子窗口再次分隔的效果。
创建一个工程名为“ss”的SDI程序,演示对主框架多层次分隔,类似于Outlook的界面效果。
1)修改预编译头文件StdAfx.h,统一添加视图类头文件“afxcview.h”,如图12-21所示。

图12-21 修改预编译头文件
2)在类视图中添加以下派生类,见表12-3。
表12-3 新添加视图和框架类的派生类

3)在App类的头文件ss.h中,定义各个视图和子框架的指针变量。

4)修改4个派生类的构造函数,初始化以上指针变量。

5)修改CMainFrame类的头文件,添加分隔器变量并去掉原有的ChildView变量。

6)在CMainFrame类中,添加OnCreateClient虚函数并修改代码。

7)修改CRightFrame类的头文件,添加一个分隔器变量。

8)在CRightFram类中,增加OnCreateClient虚函数并修改代码。

9)编译并运行,测试代码。这样就完成了一个多层分隔窗口,如图12-22所示。(https://www.daowen.com)

图12-22 查看运行结果
10)在CLeftView类中,添加视图初始化虚函数并修改代码。


11)在CTopView类中,添加视图初始化虚函数并修改代码。

12)在CTopView类中,添加LVN_ITEMCHANGED消息反射函数并修改代码。

13)在CRightFrame类中,添加PreCreateWindow虚函数并修改代码。


14)编译并运行,测试代码,如图12-23所示。
继续开发下去,就能够开发出完整的类似于Outlook软件的界面。

图12-23 查看运行结果
15)在使用分隔器窗口的项目开发中,不但要通过分隔器创建多个分隔视图,而且还要使各个视图和框架之间能够方便自如地相互访问。常见的视图和框架间访问方法如下。
①调用CSplitterWnd::GetPane函数,获取某行某列的分隔视图对象的地址。
②在主框架类(CMainFrame)中定义各个视图的指针变量,再通过AfxGetMainWnd函数获取。
③统一在应用程序类(App)中定义各个视图的指针变量,再通过AfxGetApp函数获取。