MFC之拆分窗口

7.3.1 多视图
许多文档只要求单个视图,但每个文档可支持一个以上的视图。为了帮助编程人员实现多个视图,文档对象保留它的视图列表、为添加和移去视图提供成员函数,例如,提供的UpdateAllViews成员函数可使多个视图知道文档数据何时已被更改。
MFC支持在同一文档上使用多个视图的3种通用模式,这些模式是:
(1) 在各自MDI文档窗口中包含同一个视图类的多个视图对象。用户有时需要应用程序能为同一个文档打开另一个文档窗口,以便能同时使用两个文档窗口来查看文档的不同部分内容。用MFC AppWizard创建的多文档应用程序支持这种模式,当用户选择“窗口”菜单的“新建窗口”命令时,系统就会为第一个文档窗口创建一个副本。
(2) 在同一个文档窗口中包含同一个视图类的多个视图对象。这种模式实际上是使用“切分窗口”机制使SDI应用程序具有多视的特征。
(3) 在单独一个文档窗口中包含不同视图类的多个视图对象。在该模式下,多个视图共享同一个文档窗口。它有点象“切分窗口”,但由于视图可由不同的视图类构造,所以同一个文档可以有不同的显示方法。例如,同一个文档可同时有文字显示方式及图形显示方式的视图。
7.3.2 窗口的切分
1、 静态切分和动态切分
对于“静态切分”窗口来说,当窗口第一次被创建时,窗格就已经被切分好了,窗格的次序和数目不能再被改变,但用户可以移动切分条来调整窗格的大小。每个窗格通常是不同的视图类。
对于“动态切分”窗口来说,它允许用户在任何时候对窗口进行切分,用户既可以通过选择菜单项来对窗口进行切分,也可以通过拖动滚动条中的切分块对窗口进行切分。动态切分窗口中的窗格通常使用的是同一个视图类。当切分窗口被创建时,左上窗格通常被初始化成一个特殊的视图。当视图沿着某个方向被切分时,另一个新添加的视图对象被动态创建;当视图沿着两个方向被切分时,新添加的三个视图对象则被动态创建。当用户取消切分时,所有新添加的视图对象被删除,但最先的视图仍被保留,直到切分窗口本身消失为止。
无论是静态切分还是动态切分,在创建时都要指定切分窗口中行和列的窗格最大数目。对于静态切分,窗格在初始时就按用户指定的最大数目划分好了;而对于动态切分窗口,当窗口构造时,第一个窗格就被自动创建。动态切分窗口允许的最大窗格数目是2 x 2,而静态切分允许的最大窗格数目为16 x 16。
2、 切分窗口的CSplitterWnd类操作
在MFC中,CSplitterWnd类封装了窗口切分过程中所需的功能函数,其中成员函数Create和CreateStatic分别用来创建“动态切分”和“静态切分”的文档窗口,函数原型如下:
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 );
BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST );
其中,参数pParentWnd表示切分窗口的父框架窗口。nMaxRows表示窗口动态切分的最大行数(不能超过2)。nMaxCols表示窗口动态切分的最大列数(不能超过2)。nRows表示窗口静态切分的行数(不能超过16)。nCols表示窗口静态切分的列数(不能超过16)。sizeMin表示动态切分时允许的窗格最小尺寸。
CSplitterWnd类成员函数CreateView用来为静态窗格指定一个视图类,并创建视图窗口,其函数原型如下:
BOOL CreateView( int row, int col, CRuntimeClass* pViewClass,
SIZE sizeInit, CCreateContext* pContext );
其中,row和col用来指定具体的静态窗格,pViewClass用来指定与静态窗格相关联的视图类,sizeInit表示视图窗口初始大小,pContext用来指定一个“创建上下文”指针。“创建上下文”结构CCreateContext包含当前文档视图框架结构。
3、 静态切分窗口实现
利用CSplitterWnd成员函数,用户可以在文档应用程序的文档窗口中添加动态或静态切分功能。
4、示例程序——将单文档应用程序中的文档窗口静态分成3 x 2个窗格
(1) 用MFC AppWizard创建一个默认的单文档应用程序Ex_SplitSDI。
(2) 打开框架窗口类MainFrm.h头文件,为CMainFrame类添加一个保护型的切分窗口的数据成员,如下面的定义:
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CSplitterWnd m_wndSplitter;
(3) 用MFC类向导创建一个新的视图类CDemoView(基类为CView)用于与静态切分的窗格相关联,如图7-13所示。
(4) 重写CMainFrame类的OnCreateClient函数(当主框架窗口客户区创建的时候
自动调用该函数),并添加下列代码:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
CCreateContext* pContext) {
CRect rc;
GetClientRect(rc); // 获取客户区大小
// 计算每个窗格的平均尺寸
CSize paneSize(rc.Width()/2-16,rc.Height()/3-16);
m_wndSplitter.CreateStatic(this,3,2); // 创建3 x 2个静态窗格
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDemoView),paneSize,
pContext); // 为相应的窗格指定视图类
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDemoView),paneSize,
pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CDemoView),paneSize,
pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CDemoView),
paneSize,pContext);
m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CDemoView),
paneSize,pContext);
m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CDemoView),
paneSize,pContext);
return TRUE;
}
(5) 在MainFrm.cpp 源文件的开始处,添加视图类CDemoView 的包含文件:
#include "DemoView.h"
(6) 编译并运行,结果如图7-14 所示。

7.3.3 多视图编程示例
下面的示例是在一个多文档应用程序Ex_Rect 中为同一个文档数据提供两种不同的显示和编辑方式,如图7-15 所示。在左边的窗格中,用户可以调整小方块在右边窗格的坐标位置。而若在右边窗格中任意单击鼠标,相应的小方块会移动到当前鼠标位置处,且左边窗格的编辑框内容也随之发生改变。

 

转载于:https://www.cnblogs.com/x739400043/p/4732172.html

MFC(Microsoft Foundation Class)是微软提供的一种C++类库,用于快速开发Windows界面应用程序。其中的拆分窗口可以有效地将窗口分割成多个子窗口,方便用户在一个窗口中同时显示多个视图或控件。 动态拆分示例是指在程序运行时根据用户的操作或其他条件来动态地改变拆分窗口的布局。以一个简的文本编辑器为例,用户可能希望在编辑文本的同时查看另一部分文档内容。在这种情况下,可以使用动态拆分窗口来实现在编辑区域和预览区域的同时显示。 在MFC中,可以使用拆分窗口类(CSplitterWnd)来实现动态拆分窗口。通过在代码中响应用户的操作或其他条件的变化,可以动态地改变拆分窗口的布局。比如,可以通过捕获用户的鼠标事件来改变拆分窗口的大小和位置,或者根据用户的选择来动态地增加或减少子窗口的数量。 动态拆分窗口的实现需要一定的编程经验和理解MFC的相关知识。在使用MFC拆分窗口进行动态拆分时,需要根据具体的需求和UI设计来选择合适的拆分方式和布局。同时,为了提高用户体验,还需要注意在动态改变拆分窗口布局时保持界面的流畅和稳定。 总之,MFC拆分窗口提供了丰富的功能和灵活的布局方式,可以通过动态拆分实现更加灵活和复杂的界面布局。通过合理的设计和实现,动态拆分窗口可以为用户提供更加便捷和高效的操作体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值