MFC单文档窗口分割(拆分)

所用环境:Windows10 64位操作系统、VC++6.0编译器、MFC开发架构
实现功能:在MFC程序的单文档模式下,将窗口进行分割(拆分),结果如下
在这里插入图片描述
可以看到,在单文档下,窗口被分为了左右两个部分,左侧包含各种可视化控件,右侧就是正常的绘图区。
接下来我们开始一步步的实现这种效果。

以下内容分为如下几个部分:
1.创建工程
2.可视化编辑左侧窗体
3.在MainFrame.cpp中将初始窗口分割(拆分)为两个部分
4.使用Doc文档作为桥梁,使数据可以在左侧窗体和右侧窗口之间传递

1.创建工程

首先我们新建项目,选择工程,MFC APPWizard[exe]子项目,工程名设置为Test02,C位置就是工程文件的保存位置。

在这里插入图片描述
再点击确定之后,选择单个文档类型,然后其他配置使用缺省设置,直接单击完成即可。

在这里插入图片描述
单击确定继续操作

在这里插入图片描述
这个时候我们就创建好了项目,接下来我们开始先创建一个我们需要的左侧窗口,因为右侧的绘图窗口工程中是默认存在的。

2.可视化编辑左侧窗体

在ResourceView选择卡中,我们可以看到Dialog中包含一个AboutBox,这个是帮助按钮的弹窗,我们在Dialog文件夹上右击,选择“Insert Dialog”选项
在这里插入图片描述
系统会自动创建一个ID为IDD_DIALOG1的窗口,我们右击这个窗口,选择最低侧的属性选项
在这里插入图片描述
在这个窗口的General选择卡中,我们可以配置这个窗体的ID和标题,这里我们直接使用默认的即可
在这里插入图片描述
然后我们转到Styles选择卡中进行一些配置,将Style改为Child,子窗口。Border设置为None,无。
在这里插入图片描述
之后我们就可以看到我们的窗体变成了这样
在这里插入图片描述
我们直接将默认的两个按钮删除。鼠标左键单击选中按钮控件,使用键盘上的DEL键删除即可。
(注:DEL为一组六个键中INS键下面的键,也是数字键盘中’.'的另一种功能键)
接下来我们在红点出右击鼠标,会弹出如下的窗口,我们使用鼠标左键单击Controls,就可以呼出一个基本的可视化窗口控件窗口,如下图
在这里插入图片描述在这里插入图片描述
然后我们添加两个按钮到我们的窗体中。添加过程为:鼠标左键选择红框位置的图标,将鼠标移动到窗体中,你想要添加按钮的位置,再次左键单击即可完成添加。
在这里插入图片描述
随后我们选择其中一个按钮控件,右击选择属性。在General选择卡里面,我们可以给这个按钮设置它的ID和标题。设置完成之后,直接单击窗口右上角的X,即可关闭属性配置窗口,在这里面更改的参数会自动同步保存。
在这里插入图片描述
加下来我们双击第一个名为“确定”的按钮,就可以给这个按钮添加一个对应的单击处理事件。可以看到弹出一个窗口,这个窗口问我们,要使用这个功能,就必须为这个对话框(窗口)绑定一个类,我们是想“Create a new class”创建一个新的类,还是选择一个已有的类。因为我们并没有创建什么跟类有关的东西,所以我们选择创建一个新的类,单击ok。
在这里插入图片描述
在我们单击OK按钮之后,就会弹出这么一个窗口,让我们设置类的一些属性,比如类名,这个类的父类,以及这个类所对应的Dialog ID等。我们按照图片给这个类设置参数。
在这里插入图片描述
在创建完窗口所绑定的类之后,我们在这个窗口里面找到我们原来设置的按钮的ID,然后为其添加一个ID为BN_CLICKED的函数,也就是鼠标单击此按钮的处理事件函数。
在这里插入图片描述
在单击Add Function按钮之后,会弹出这个窗口,询问你所要添加的事件处理函数的名字是什么,这里就直接使用默认的名字即可。
在这里插入图片描述
我们可以看到在下面的Member functions里面已经多了一个我们刚刚添加的函数,这个时候我们单击Edit Code按钮,就可以进入到代码文件中,对这个按钮的事件处理函数进行编码。
在这里插入图片描述
可以看到现在我们所处的位置就变换到了LeftWindow.cpp里面,所浏览的函数也就是我们原来添加的OnTest01。
在这里插入图片描述
现在我们先不往里面加东西。

3.在MainFrame中分割(拆分)窗口

接下来我们进入FileView选择卡,在Header Files目录下的MainFrame.h中,添加这么一行代码: CSplitterWnd m_wndSplitter; 就是说我们定义了一个变量,一个CSplitterWnd 类型的变量,名字叫m_wndSplitter。做这一步操作不用添加头文件,也不用做其他事情,只需要将代码放到这个位置即可。将代码放到这个位置之后,我们Build一个项目,可以发现左侧的目录树多出了一个目录“External Dependencies”。

在这里插入图片描述
然后我们进入到MainFrame.cpp中,使用Ctrl+W快捷键(或者鼠标右键选择,建立类向导Class Wizard),为这个类添加一个名为OnCreateClient的函数,这个函数会在创建窗口的时候被调用。

在这里插入图片描述
创建好函数之后,我们直接使用如下内容替换掉函数里面的内容
代码很简单,第一行是将此窗口分为一行两列的区域。
第二行是在0,0位置的区域,放上我们原来创建的LeftWindow窗口,大小是190x600。
第三行是在0,1位置的区域,放上我们系统默认生成的CTest02View绘图窗口,大小是520x600。
注:这里要注意一个地方,就是CTest02View这个类,你从左侧看,它的文件名字是Test02VIew.cpp和Test02View.h,但是它的类名,当你双击到Test02View.h里面之后会发现,它的类名是CTest02View

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	m_wndSplitter.CreateStatic(this,1,2);
	m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(LeftWindow),CSize(190,600),pContext);
	m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTest02View),CSize(520,600),pContext);

	return TRUE;
}

这个时候我们直接Build,编译器是会直接报错的,提示我们没有这两个类。这个时候我们只需要在文件上面使用#include "xxxx.h"将它们包含进来即可
在这里插入图片描述
这个时候我们编译的话,还是会报错。对于这个错,我们只需要在这个文件(Test02View.h)的上面加上这个即可 #include “Test02Doc.h”,将Test02Doc这个文档类包含进来。
在这里插入图片描述
这个时候我们编译运行项目之后,就可以看到我们的窗口被分为了两个部分。如下
在这里插入图片描述

4.左右窗口间数据的传输

到这里,基本上就已经完成了,接下来就是在左右窗口之间架起一个桥梁,让它们之间的数据可以互通共享。 这里我所使用的方式是借助文档类来做这个桥梁。 我们首先在Test02Doc.h中,添加两个CPoint对象。

在这里插入图片描述
然后我们就可以在左右窗口中使用它们。
使用的时候加上如下代码即可
修改时

	CTest02Doc *pDoc =(CTest02Doc*)GetDocument();// 获取文档
	CPoint start,end;
	start.x = 0, start.y = 0;
	end.x = 100, end.y = 100;
	// 更改数据
	pDoc->p1 = start;
	pDoc->p2 = end;

	pDoc->UpdateAllViews(NULL);// 更新数据

使用时

	CSubWindowTestDoc* pDoc = GetDocument();// 获取文档
	ASSERT_VALID(pDoc);// 同步数据
	// TODO: add draw code for native data here
	// 使用数据
	pDC->MoveTo(pDoc->p1);
	pDC->LineTo(pDoc->p2);

我们在LeftWindow.cpp中的按钮事件处理函数中添加修改时的代码,在Test02View.cpp中的OnDraw函数下添加使用时的代码。
注意:因为Test02View.cpp中的OnDraw函数中,自动生成了前两行代码,所以在添加的时候只需要添加下面两行代码即可。

项目运行效果展示

编译运行

在这里插入图片描述
在单击确定按钮之后
在这里插入图片描述

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值