vs2010c语言窗口程序,VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)...
上一节中鸡啄米讲了文档、视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口。
分割窗口概述
分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图。
MFC分割窗口的方式有两种,动态分割和静态分割。
动态分割窗口通常用于创建同一个文档对应的多个视图,而且这些视图一般都是同一类型的视图,能够在用户编辑文档的不同部分时提供方便。
大家看下Word里的动态分割窗口就很明白了,以Word 2007文档为例,在菜单中点击“视图”->“拆分”,就可以看到一条随鼠标移动的分隔条,当我们在文档中某个位置按下鼠标左键时,分割条就固定了下来,生成了上下两个分割窗格,通过滚动每个窗格中的垂直滚动条可以看到,两个窗格中的内容相同,这就是所说的对应同一个文档的同一类视图。
动态分割窗口最多可以有两行两列。
静态分割窗口比较常见。我们经常能看到某个软件打开后,界面窗口默认被分割成了几个窗格,这就是静态分割窗口。
静态分割窗口指在窗口创建时,分割的窗格就已经生成了,而且用户不能改变窗格的数量和顺序。静态分割窗口最多支持16行16列。通常静态分割窗口的每个窗格中包含不同类的视图,当然也可以是同一类的视图。
CSplitterWnd类
MFC中的分割窗口类-CSplitterWnd类提供了分割窗口的功能。CSplitterWnd类中包含一个分割器窗口,该分割器窗口就是一个包含多个窗格的窗口。我们分割窗口时就是直接在此分割器窗口中分割的。
鸡啄米下面介绍三个最常用的成员函数:
C++代码virtualBOOLCreate(
CWnd* pParentWnd,
intnMaxRows,
intnMaxCols,
SIZE sizeMin,
CCreateContext* pContext,
DWORDdwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
UINTnID = AFX_IDW_PANE_FIRST
);
创建动态分割窗口。参数pParentWnd为分割器窗口的父框架窗口;参数nMaxRows为分割器窗口的最大行数,不能超过2;参数nMaxCols为分割器窗口的最大列数,也不能超过2;参数sizeMin为窗格能显示的最小尺寸,如果窗格尺寸小于sizeMin则不显示;参数pContext为指向CCreateContext结构的指针,大多数情况下可以赋值为父框架窗口的pContext;参数dwStyle指定窗口风格;参数nID为分割窗口的ID,除非分割器窗口嵌入到另一个分割器窗口中,否则可以取值AFX_IDW_PANE_FIRST。
C++代码virtualBOOLCreateStatic(
CWnd* pParentWnd,
intnRows,
intnCols,
DWORDdwStyle = WS_CHILD | WS_VISIBLE,
UINTnID = AFX_IDW_PANE_FIRST
);
创建静态分割窗口。参数pParentWnd、dwStyle和nID同上;参数nRows为行数,不能超过16;参数nCols为列数,同样不能超过16。
C++代码virtualBOOLCreateView(
introw,
intcol,
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++代码BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
// 创建动态分割窗口,两行两列
returnm_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++代码BOOLCMainFrame::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))
returnFALSE;
// 创建上面窗格中的视图
if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))
returnFALSE;
// 创建下面窗格中的视图
if(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))
returnFALSE;
returnTRUE;
//return CFrameWndEx::OnCreateClient(lpcs, pContext);
}
4. 运行程序,在结果界面中关掉其他面板后效果如下:
如果大家想创建在其中某个窗格中再嵌套分割窗口,那么就需要再定义一个CSplitterWnd对象,以父窗格所在的CSplitterWnd对象为父框架窗口创建分割窗口即可。
分割窗口的内容就讲到这里了。鸡啄米依然谢谢大家的支持。
除非特别注明,鸡啄米文章均为原创
2012年8月24日
作者:鸡啄米
浏览:
vs2010c语言窗口程序,VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)...相关推荐
- VS2010/MFC编程入门之四(MFC应用程序框架分析)
上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...
- (转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)
上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...
- VS2010/MFC编程入门之四十四:定时器Timer
前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...
- VS2010/MFC编程入门教程之目录和总结
写这套VS2010/MFC编程入门教程历时八个月,时间比较长,都是鸡啄米在工作之余加班加点完成的.虽然有点累,但看到有这么多人过来支持鸡啄米,很是值得. 写每节教程我都力求讲明白,深入浅出的阐述每个知 ...
- VS2010/MFC编程入门
近来鼓捣2D小游戏的过程中发现鸡啄米大神很好的MFC系列资料,在此汗颜将地址扒拉了过来,留待以后慢慢学习. VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) (http://ww ...
- VS2010/MFC编程入门教程
一.VS2010/MFC编程入门教程之目录 第一部分:VS2010/MFC开发环境 VS2010/MFC编程入门之前言 VS2010/MFC编程入门之一(VS20 ...
- VS2010/MFC 编程入门教程之目录和总结
[原地址]:http://www.jizhuomi.com/software/257.html 鸡啄米这个网站不是很了解,但确实有很多好文章.自己工作需要,在vs2010 下学习mfc的知识,发现了这 ...
- VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...
- (转载)VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)...
上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...
最新文章
- Keycloak简单几步实现对Spring Boot应用的权限控制
- 反向传播神经网络 BPNN
- 科大星云诗社动态20210506
- 【Hibernate】Hibernate查询语言HQL详解
- python编码程序_python 编码
- 导轨式网管型工业交换机优势具体在哪里呢?
- 用了fastapi还需要nginx_nginx 与 fastdfs 的配置过程,已经越过了许多坑,我跪着进入了欢迎页面。。。...
- Leetcode--215. 数组中第K个最大元素
- jquery之统计数字parseFloat
- 人脸生成:Beyond Face Rotation: Global and Local Perception GAN
- 编程c语言中,向上取整函数_C编程中的函数
- 【转】Linux内核调试方法总结
- 《PMP学习笔记》4.6 子过程:监控项目工作
- 常见反爬虫策略 及应对措施
- 使用反相器的rc振荡电路
- bzoj4199 [Noi2015]品酒大会
- 视频剪辑教程,视频批量分割,分割后的新视频怎么保存
- 计算机网络长度,以太网中mtu默认长度 你应该知道的计算机网络知识(2)
- 短信API整合在spring里面(3)
- 基于MS的氢键分析脚本介绍