分割窗口概述

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

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

动态分割窗口通常用于创建同一个文档对应的多个视图,而且这些视图一般都是同一类型的视图,能够在用户编辑文档的不同部分时提供方便。

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

动态分割窗口最多可以有两行两列。

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

静态分割窗口指在窗口创建时,分割的窗格就已经生成了,而且用户不能改变窗格的数量和顺序。静态分割窗口最多支持16行16列。通常静态分割窗口的每个窗格中包含不同类的视图,当然也可以是同一类的视图。

CSplitterWnd类

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

鸡啄米下面介绍三个最常用的成员函数:

C++代码
  1. virtual BOOL Create(
  2. CWnd* pParentWnd,
  3. int nMaxRows,
  4. int nMaxCols,
  5. SIZE sizeMin,
  6. CCreateContext* pContext,
  7. DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
  8. UINT nID = AFX_IDW_PANE_FIRST
  9. );

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

C++代码
  1. virtual BOOL CreateStatic(
  2. CWnd* pParentWnd,
  3. int nRows,
  4. int nCols,
  5. DWORD dwStyle = WS_CHILD | WS_VISIBLE,
  6. UINT nID = AFX_IDW_PANE_FIRST
  7. );

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

C++代码
  1. virtual BOOL CreateView(
  2. int row,
  3. int col,
  4. CRuntimeClass* pViewClass,
  5. SIZE sizeInit,
  6. CCreateContext* pContext
  7. );

为静态分割窗口创建窗格视图。参数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++代码
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  2. {
  3. // TODO: Add your specialized code here and/or call the base class
  4. // 创建动态分割窗口,两行两列
  5. return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext);
  6. //return CFrameWndEx::OnCreateClient(lpcs, pContext);
  7. }

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++代码
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  2. {
  3. // TODO: Add your specialized code here and/or call the base class
  4. CRect rc;
  5. // 获取框架窗口客户区的CRect对象
  6. GetClientRect(&rc);
  7. // 创建静态分割窗口,两行一列
  8. if (!m_wndSplitter.CreateStatic(this, 2, 1))
  9. return FALSE;
  10. // 创建上面窗格中的视图
  11. if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))
  12. return FALSE;
  13. // 创建下面窗格中的视图
  14. if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))
  15. return FALSE;
  16. return TRUE;
  17. //return CFrameWndEx::OnCreateClient(lpcs, pContext);
  18. }

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

如果大家想创建在其中某个窗格中再嵌套分割窗口,那么就需要再定义一个CSplitterWnd对象,以父窗格所在的CSplitterWnd对象为父框架窗口创建分割窗口即可。

分割窗口的内容就讲到这里了。鸡啄米依然谢谢大家的支持。

转载地址:http://www.jizhuomi.com/software/226.html

转载于:https://www.cnblogs.com/zfluo/p/5131885.html

鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)相关推荐

  1. 鸡啄米vc++2010系列27(列表视图控件List Control 上)

    列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...

  2. 鸡啄米vc++2010系列11(非模态对话框的创建)

    上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...

  3. 鸡啄米vc++2010系列35(工具栏资源及CToolBar类)

    工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗 ...

  4. 鸡啄米vc++2010系列2(项目文件分析)

    用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件 ...

  5. 鸡啄米vc++2010系列12(属性页对话框)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  6. 鸡啄米vc++2010系列7(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

  7. 鸡啄米vc++2010系列32(标签控件Tab Control 下)

    上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...

  8. 深入浅出MFC文档/视图架构之文档

    1.文档类CDocument 在"文档/视图"架构的MFC程序中,文档是一个CDocument派生对象,它负责存储应用程序的数据,并把这些信息提供给应用程序的其余部分.CDocum ...

  9. MFC之文档/视图结构应用程序

    文档/视图结构应用程序 一.文档/视图结构分析 MFC 通过多个类提供了对程序框架的支持,使用这些类可以简单地实现文档/视图结构:其中主要包括以下五个类: 应用程序类(CWinAPP):是 MFC 程 ...

最新文章

  1. SQL SERVER中ROLLUP的用法
  2. AI面试官也太好骗了吧!
  3. 何玺对话苏宁金融洪蜀宁:区块链是颠覆性技术,意义远超互联网
  4. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
  5. 保存数组类型数据_JS基本数据类型和引用数据类型的区别及深浅拷贝
  6. 如何找到SAP support package名称
  7. win7 以太网媒体断开怎么处理_工业以太网协议的历史及其优势
  8. cad截图软件_AutoCAD电气制图协会线上CAD学习打卡活动结束
  9. python随机森林变量重要性_随机森林如何评估特征重要性【机器学习面试题详解】...
  10. matlab节约里程法_新手求大神指导,MATLAB中怎么使用节约里程法
  11. OpenCV图像处理之直方图
  12. mac怎么无线打印机连接到服务器,Mac上wifi打印机怎么用 wifi打印机连接使用教程...
  13. 最新个人所得税计算方法
  14. 第16节 调试-粒子系统放在地球上,不见了
  15. 春招必看一位老学长的真实互联网校招求职心路历程~
  16. 新鲜的蔬菜和水果中富含抗氧化物,可以有效延缓衰老和疾病
  17. c++中cout、cerr、clog的区别
  18. 随笔(十一)——在杭州的100天-第十天
  19. 史上最“牛”,荣辱参半的的JAVA群规和QQ群
  20. 100 道常见 Hadoop 面试题及答案解析

热门文章

  1. 基于matlab的单相pwm逆变电路的仿真研究,基于MATLAB的单相PWM逆变电路的仿真研究...
  2. 【Mybatis】分割字符串
  3. activiti 流程图乱码
  4. 更换Spring底层日志框架
  5. $.ajax 发送请求,JavaScript之Ajax-2 Ajax(使用Ajax发送get请求、使用Ajax发送post请求)
  6. mysql练习数据_数据分析学习第一关-入门
  7. python 跳一跳辅助_使用Python制作微信跳一跳辅助
  8. mysql 5.6 安装_MySQL的安装,步骤详细
  9. html按键清空怎么写_html的空格代码怎么写?教你如何使用空格nbsp代码
  10. 确诊新冠小米员工的活动轨迹,这就是人间真实吗?