VS2013/MFC 单文档SDI和多文档MDI窗口分割实现

网上有很多关于MFC单文档的窗口分割程序,但是少有介绍多文档程序的,而且基本没有VS2013开发平台的。本文主要介绍一下单文档和多文档程序的静态窗口分割。

1.窗口分割类别

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

动态分割窗口是指:用户可以动态的分割和除去分割窗口,分割窗口会创建和删除相应的窗格。Microsoft Word就是使用动态分割窗口的例子,这是一种最常用的分割窗口。动态分割窗口最多可以有2行*2列个窗格。

静态分割窗口是指:在窗口创建时,分割窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变。窗格为一个分割条所分割,用户可以拖动分割条调整相应的窗格的大小。Visual Studio的图标编辑器就是静态分割窗口的例子。在编辑器的左边窗格,显示图标的缩微图像,在右边显示图标的编辑窗口,可以拖动中间的分割条调整两个窗格的大小。静态分割窗口最多可以有16行*16列的窗格。

2.CSplitterWnd类

实现窗口分割主要用到的类是CSplitterWnd。最常用的成员函数有三个,分别如下:

1)create成员函数

CSplitterWnd::Create
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
);

Create:创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接.参数:
pParentWnd表示切分窗口的父框架窗口;
nMaxRows,nMaxCols是创建切分窗口的最大列数和行数(动态创建的分割窗口的窗格数目不能超过2x2);
sizeMin指出显示一个窗格所需的最小尺寸;
pContext指向一个CCreateContext结构的指针(多数情况这个值可以是传递给父框架窗口的pContext);
dwStyle指定窗口的风格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).

2)CreateStatic成员函数

CSplitterWnd::CreateStatic
BOOL CreateStatic( 
	CWnd* pParentWnd,
	int nRows,
	int nCols,
	DWORD dwStyle = WS_CHILD | WS_VISIBLE,
	UINT nID = AFX_IDW_PANE_FIRST
);

CreateStatic:创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接.参数:
pParentWnd表示切分窗口的父框架窗口;
nRows行数.该值不能超过16;
nCols列数.这个值必须不超过16;
dwStyle指定窗口的风格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).

3)CreateView成员函数

CSplitterWnd::CreateView
virtual BOOL CreateView( 
	int row, 
	int col, 
	CRuntimeClass* pViewClass, 
	SIZE sizeInit, 
	CCreateContext* pContext 
);

CreateView:在一个分隔器窗口中创建一个窗格.参数:
row指定用来放置新视的分隔器窗口行;
col指定用来放置新视的分隔器窗口列(最多创建16*16窗口);
pViewClass指定新视的CRuntimeClass;
sizeInit指定新视的初始尺寸;
pContext 指向用来创建此视的创建环境的指针(该pContext被传递给创建此分隔器窗口的父框架的重载的OnCreateClient成员函数).

3.单文档静态窗口分割

1)新建单文档程序,项目名称SplitWindow,生成CAboutDlg、CMainFrame、CSplitWindowApp、CSplitWindowDoc和CSplitWindowView五个默认的类。运行结果如下:

 2)向CMainFrame类中添加一个公有成员变量,类型为CSplitterWnd,变量名为m_wndSplitter.在"类视图"右键"CMainFrame",选择"添加"->"添加变量".

3)利用"类向导"为CMainFrame类添加OnCreateClient事件.在“类视图”右键“CMainFrame”,选择“类向导”添加虚函数OnCreateClient.,如下图所示:

 4)在CMainFrame.cpp中添加头文件#include "SplitWindowDoc.h",#include "SplitWindowView.h"而且Doc在View前面添加。否则会出错。在虚函数OnCreateClient中添加如下代码,RUNTIME_CLASS中的视图类可以自定义。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO:  在此添加专用代码和/或调用基类
	CRect rc;
	GetClientRect(&rc);//获取框架窗口客户区的CRect对象

	if (!m_wndSplitter.CreateStatic(this, 1, 2))  // 创建1行2列分割
	{
		return FALSE;
	}
	// 创建右边窗格中的视图   
	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSplitWindowView), CSize(160 + GetSystemMetrics(SM_CXVSCROLL)), pContext))
		return FALSE;
	// 创建左边窗格中的视图   
	if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitWindowView), CSize(0, 0), pContext))
		return FALSE;

	return TRUE;
	//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

运行结果如下图所示:

 4.多文档静态窗口分割

1)新建多文档程序,项目名称SplitWindowd,生成CAboutDlg、CChildFrame、CMainFrame、CSplitWindowdApp、CSplitWindowdDoc和CSplitWindowdView 6个默认的类。运行结果如下:

 2)向CChildFrame类中(不能在CMainFrame中添加,否则会出错)添加一个公有成员变量,类型为CSplitterWnd,变量名为m_wndSplitter.在"类视图"右键"CChildFrame",选择"添加"->"添加变量".

 3)利用"类向导"为CChildFrame类添加OnCreateClient事件.在“类视图”右键“CChildFrame”,选择“类向导”添加虚函数OnCreateClient.

 4)在CChildFrame.cpp中添加头文件#include "SplitWindowdDoc.h",#include "SplitWindowdView.h"而且Doc在View前面添加。否则会出错。在虚函数OnCreateClient中添加如下代码,RUNTIME_CLASS中的视图类可以自定义。

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO:  在此添加专用代码和/或调用基类
	CRect rc;
	GetClientRect(&rc);//获取框架窗口客户区的CRect对象

	if (!m_wndSplitter.CreateStatic(this, 1, 2))  // 创建1行2列分割
	{
		return FALSE;
	}
	// 创建右边窗格中的视图   
	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSplitWindowdView), CSize(160 + GetSystemMetrics(SM_CXVSCROLL)), pContext))
		return FALSE;
	// 创建左边窗格中的视图   
	if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitWindowdView), CSize(0, 0), pContext))
		return FALSE;

	return TRUE;
	//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

运行结果如下图所示:

参考文献:

http://www.jizhuomi.com/software/226.html

https://blog.csdn.net/eastmount/article/details/18987539

http://biancheng.45soft.com/vc-mfc/mdi/2777.html

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值