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方法的实现中,加入上面的代码 |