8.5分割视图
分割窗口将窗口分成几个部分,每个部分通常代表一个视图(但也可以是具有子窗口标识的CWnd对象),又称窗格。如图8-8所示。如果想在一个窗口里面观察文档的不同部分,或者是在一个窗口里用不同类型的视图(比如用图表和表格)观察同一个文档,那么采用分割窗口是非常方便的。许多优秀的软件都采用了分割窗口技术,因此我们有必要掌握分割窗口的用法。
图8-8 分割窗口
分割窗口分为两类:动态分割窗口和静态分割窗口。
动态分割窗口是指:用户可以动态的分割和除去分割窗口,分割窗口会创建和删除相应的窗格。Microsoft Word就是使用动态分割窗口的例子,这是一种最常用的分割窗口。动态分割窗口最多可以有2行´ 2列个窗格。
静态分割窗口是指:在窗口创建时,分割窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变。窗格为一个分割条所分割,用户可以拖动分割条调整相应的窗格的大小。如图8-9,Visual Studio的图标编辑器就是静态分割窗口的例子。在编辑器的左边窗格,显示图标的缩微图像,在右边显示图标的编辑窗口,可以拖动中间的分割条调整两个窗格的大小。静态分割窗口最多可以有16行´ 16列的窗格。
图8-9 图标编辑器—静态分割窗口的例子
这里我们只介绍动态分割窗口的使用,有关静态分割窗口的用法,读者可以参考Visual C++的例子VIEWEX,它在SAMPLES\MFC\GENERAL \VIEWEX目录下。
要使文档视结构程序支持动态分割窗口,可以有三种方法:
1.在用AppWizard创建窗口时指定分割窗口风格:
在MFC AppWizard Step 4 of 6对话框中,点Advanced按钮。弹出Advanced Options对话框,选择Window Styles标签页。如图8-10,选中该页的Use Split Window检查框。这样生成的应用程序就自动支持分割窗口功能。
图8-10 Window Styles设置
如果应用程序已经生成,采用这种方法就不合适了。此时,可以使用下面的两种方法:
2.使用Component Gallery为已经生成的应用程序增加分割窗口功能:
打开相应的工程文件。选择Project-Add To Project-Components and controls菜单,弹出
Components and controls Gallery对话框。双击Developer Studio Components目录,从该目录下选择split Bars控件。Visual C++提示split Bar对话框,对话框内有三个选项:Horizontal,Vertical和Both,用于指定在水平方向、垂直方向还是两个方向都使用分割窗口。选择Both,点OK关闭Split Bar对话框,此时Component Gallery就将分割窗口功能添加到了Draw程序中。再点OK关闭Components and controls Gallery对话框。然后浏览应用程序类,看有什么变化。
在childfrm.h中,增加了以下内容:
// Generated message map functions
protected:
CSplitterWnd m_wndSplitter;
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
m_wndSplitter是一个CSplitterWnd类的对象。CSplitterWnd是MFC提供的一个类,它提供了窗格分割控制,以及能被所有同一行或列上的窗格共享的滚动条。这些行和列的值都是从0开始的整数,第一个窗格的行数和列数都为0。
另外还重载了子框架窗口的OnCreateClient方法。在该函数内部,创建了分割窗口控制:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// CG: The following block was added by the Split Bars component.
{
if (!m_wndSplitter.Create(this,
2, 2, // TODO: adjust the number of rows, columns
CSize(10, 10), // TODO: adjust the minimum pane size
pContext))
{
TRACE0("Failed to create split bar ");
return FALSE; // failed to create
}
return TRUE;
}
}
CSplitterWnd::Create方法带五个参数,第一个参数代表父窗口指针,第二个参数和第三个参数告诉CSplitterWnd要多少行、多少列的窗格,第四个参数是一个CSize类型的数据,用于指定窗格的最小大小。
第三种方法是手工加入代码:
在需要分割视图的框架窗口中加入一个CSplitterWnd类型的数据成员;用ClassWizard重载框架窗口的OnCreateClient方法,在OnCreateClient方法的实现中,加入上面的代码