VS2010-MFC(文档、视图和框架:分割窗口)

 

转自:http://www.jizhuomi.com/software/226.htmlhtml

 

上一节讲了文档、视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口。编程

 

      分割窗口概述框架

      分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每一个窗格中都包含有视图,或者是同一类型的视图,或者是不一样类型的视图。ide

       MFC分割窗口的方式有两种,动态分割和静态分割。函数

       动态分割窗口一般用于建立同一个文档对应的多个视图,并且这些视图通常都是同一类型的视图,可以在用户编辑文档的不一样部分时提供方便。工具

       你们看下Word里的动态分割窗口就很明白了,以Word 2007文档为例,在菜单中点击“视图”->“拆分”,就能够看到一条随鼠标移动的分隔条,当咱们在文档中某个位置按下鼠标左键时,分割条就固定了下来,生成了上下两个分割窗格,经过滚动每一个窗格中的垂直滚动条能够看到,两个窗格中的内容相同,这就是所说的对应同一个文档的同一类视图。this

       动态分割窗口最多能够有两行两列。spa

       静态分割窗口比较常见。咱们常常能看到某个软件打开后,界面窗口默认被分割成了几个窗格,这就是静态分割窗口。3d

       静态分割窗口指在窗口建立时,分割的窗格就已经生成了,并且用户不能改变窗格的数量和顺序。静态分割窗口最多支持16行16列。一般静态分割窗口的每一个窗格中包含不一样类的视图,固然也能够是同一类的视图。指针

 

 

       CSplitterWnd类

       MFC中的分割窗口类-CSplitterWnd类提供了分割窗口的功能。CSplitterWnd类中包含一个分割器窗口,该分割器窗口就是一个包含多个窗格的窗口。咱们分割窗口时就是直接在此分割器窗口中分割的。

       下面介绍三个最经常使用的成员函数:

C++代码
virtual BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );  

       建立动态分割窗口。参数pParentWnd为分割器窗口的父框架窗口;参数nMaxRows为分割器窗口的最大行数,不能超过2;参数nMaxCols为分割器窗口的最大列数,也不能超过2;参数sizeMin为窗格能显示的最小尺寸,若是窗格尺寸小于sizeMin则不显示;参数pContext为指向CCreateContext结构的指针,大多数状况下能够赋值为父框架窗口的pContext;参数dwStyle指定窗口风格;参数nID为分割窗口的ID,除非分割器窗口嵌入到另外一个分割器窗口中,不然能够取值AFX_IDW_PANE_FIRST。

 

 

C++代码
virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST ); 

       建立静态分割窗口。参数pParentWnd、dwStyle和nID同上;参数nRows为行数,不能超过16;参数nCols为列数,一样不能超过16。

 

 

C++代码
virtual BOOL CreateView ( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext ); 

       为静态分割窗口建立窗格视图。参数row指定分割器窗口中放置新视图的行;参数col指定放置新视图的列;参数pViewClass指定新视图的CRuntimeClass对象;参数sizeInit指定新视图的初始大小;参数pContext为指向CCreateContext结构的指针,一般能够赋值为传递给父框架窗口的重载函数CFrameWnd::OnCreateClient的pContext参数值。

 

 

       动态分割窗口

       建立动态分割窗口的步骤为:

       1. 在父框架类中定义一个CSplitterWnd类型的成员对象。

       2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。

       3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。

 

       下面给你们演示一个实例。一样以VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)中建立Example34工程为例,咱们要实如今主框架窗口的客户区中建立两行两列的动态分割窗口。如下是建立动态分割窗口的具体步骤:

       1. 在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

       2. 在Class View类视图中找到CMainFrame类,右键点击,在右键菜单中选择Properties,就会显示属性页,而后在属性页的工具栏上点击Tip为Overrides的按钮,下面的列表中就列出了可以重载的函数,找到OnCreateClient生成重载函数。

       3. 在MainFrm.cpp文件中找到刚重载的OnCreateClient函数修改以下:

C++代码
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class // 建立动态分割窗口,两行两列  return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext); //return CFrameWndEx::OnCreateClient(lpcs, pContext);  } 
 

       4. 在Resource View资源视图中,打开Menu下的IDR_MAINFRAME菜单,在View下添加一个菜单项,Caption设为Splitter Window,ID设为(必定要设为)ID_WINDOW_SPLIT。这样在运行结果界面中点击此菜单项时MFC会执行一些操做显示动态分割窗口。

       5. 运行程序,点击菜单中的View->Splitter Window菜单项,建立动态分割窗口后效果以下:

 

 

 

       静态分割窗口

       建立静态分割窗口的步骤为:

       1. 在父框架类中定义一个CSplitterWnd类型的成员对象。

       2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。

       3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,而后能够调用CSplitterWnd成员对象的CreateView成员函数为每一个窗格建立视图。 

 

 

       下面仍经过Example34工程给你们一个实例,目的是在主框架窗口中的客户区建立一个两行一列的静态分割窗口。若是已经试验过动态分割窗口的建立,那么麻烦撤销那些修改吧。建立静态分割窗口的具体步骤以下:

       1. 在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

       2. 在Class View类视图中找到CMainFrame类,右键点击,在右键菜单中选择Properties,就会显示属性页,而后在属性页的工具栏上点击Tip为Overrides的按钮,下面的列表中就列出了可以重载的函数,找到OnCreateClient生成重载函数。

       3. 在MainFrm.cpp文件中找到刚重载的OnCreateClient函数进行修改。由于鸡啄米没有新建其余视图类,因此上下两个窗格的视图都是CExample34View。为了能识别CExample34View类,还需在MainFrm.cpp文件中添加#include "Example34View.h",在Example34View.h文件中添加#include "Example34Doc.h"。最终OnCreateClient函数修改以下:

C++代码
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class   CRect rc; // 获取框架窗口客户区的CRect对象  GetClientRect(&rc); // 建立静态分割窗口,两行一列  if (!m_wndSplitter.CreateStatic(this, 2, 1)) return FALSE; // 建立上面窗格中的视图  if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext)) return FALSE; // 建立下面窗格中的视图  if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext)) return FALSE; return TRUE; //return CFrameWndEx::OnCreateClient(lpcs, pContext);  } 
 

       4. 运行程序,在结果界面中关掉其余面板后效果以下:

 

 

 

       若是你们想建立在其中某个窗格中再嵌套分割窗口,那么就须要再定义一个CSplitterWnd对象,以父窗格所在的CSplitterWnd对象为父框架窗口建立分割窗口便可。

相关文章
相关标签/搜索