MFC界面编程基础(18):文档视图结构应用程序例子(Ex_DocView)

本文详细介绍如何在MFC中创建基于CFormView的多文档应用程序,包括添加自定义数据类、修改对话框资源、编写按钮事件处理函数等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇:MFC界面编程基础(17):文档序列化下一篇:MFC界面编程基础(19):文档视图结构应用程序例子(Editor)

1.创建基于CFormView类的多文档应用程序

用MFC 应用程序向导创建一个默认的多文档应用程序Ex_DocView,但在向导的【生成的类】属性页将CEx_DocViewView的基类由默认的CView选择为CFormView类,如下图所示。

设置视图的基类为CFormView类

2.添加应用程序所需的数据

  • 第一步 在VS中,给新创建的工程添加一个新的MFC类,弹出新建类对话框。
    在这里插入图片描述
    在这里插入图片描述
    在添加类向导对话框中,类名为CStudent,默认的类文件为Student.cpp,设置该类的父类为CObject,并单击【确定】按钮。如下图所示。
    在这里插入图片描述
  • 第二步 打开项目工作区的文件视图,双击打开Student.h文件,如下图所示,编辑CStudent类定义的代码如下:
class CStudent : public CObject  
{
public:
	CStudent();
	CStudent(long code, CString name, long age, double score);
	virtual ~CStudent();

	  long m_nCode;
	  CString m_sName;
	  long m_lAge;
	  double m_lScore;
};

在这里插入图片描述

  • 第三步 同上步,编辑Student.cpp文件,修改类CStudent的构造函数实现代码如下:
CStudent::CStudent(long code,CString name,long age,double score)
{
	m_nCode=code;
	m_sName=name; 
	m_lAge=age;
	m_lScore=score;
}
  • 第四步 在Ex_DocViewDoc.h文件中,为类CEx_DocViewDoc添加数据成员:
class CEx_DocViewDoc : public CDocument
{
……
public:
      POSITION   curPos;
	  CTypedPtrList <CObList, CStudent*> m_dataList; 
……
}

说明:m_dataList定义为CStudent类指针的表CtypedPtrList变量,curPos定义为POSITION变量,用来指示当前指针。

  • 第五步 在文件stdafx…h中加入添加如下代码:
#include<afxtempl.h>

因为在程序中使用了模板类CTypedPtrList<CObList, CStudent*>。

  • 第六步 在Ex_DocViewDoc.h文件的头部添加如下代码:
#include "Student.h"
  • 第七步 在文档关闭时,需要清除m_dataList占用的内存,利用属性窗口为CEx_DocViewDoc类加入虚函数DeleteContens(),并添加代码:
void CEx_DocViewDoc::DeleteContents() 
{
	while(!m_dataList.IsEmpty()) 
	{    
		delete  m_dataList.RemoveHead();
	}
    CDocument::DeleteContents();
}

3.修改IDD_EX_DOCVIEW_FORM对话框资源,添加应用程序所需控件:

  • 第一步 打开项目工作区的资源视图,双击打开IDD_EX_DOCVIEW_FORM对话框资源如图5所示,编辑IDD_EX_DOCVIEW_FORM对话框资源,如下图所示。
    在这里插入图片描述
    在这里插入图片描述
  • 第二步 设置上图各控件的属性如下表所示。
    在这里插入图片描述
  • 第三步 打开MFC类向导的成员变量页面,确定类名是CEx_DocViewView,如下图所示。选中所需的控件ID号,双击鼠标。依次为下列控件添加成员变量,如下表所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.为按钮编写消息响应函数

  • 第一步 用MFC ClassWizard为按钮IDC_ADD添加BN_CLICKED的消息映射,如下图所示,单击【添加函数】按钮为CEx_DocViewView添加OnAdd( )成员函数,再单击【编辑代码】按钮为该含函数加入下列代码:
void CEx_DocViewView:: OnBnClickedAdd () 
{
    UpdateData(); 
	CEx_DocViewDoc *pDoc=GetDocument();
	ASSERT_VALID(pDoc); 
	CStudent *pStudent;
	pStudent=new CStudent(m_nCode,m_sName,m_lAge,m_lScore);
    pDoc->m_dataList.AddTail(pStudent); 
	pDoc->curPos=pDoc->m_dataList.GetHeadPosition();
}

在这里插入图片描述

说明:
①: UpdateData()函数迫使对话框编辑控件和相应变量之间传送数据,该函数原型为:

BOOL UpdateData(BOOL bSaveAndValidate::TRUE);

②: 其中bSaveAndValidate为true时表示数据已经更新。
在CEx_DocViewView::OnAdd()函数中,取得指向文档的指针,操作文档对象的成员变量m_dataList,首先使用用户输入的变量值构造一个新CStudent对象,然后将其加入m_dataList表尾,最后将curPos指向表头。通过上面的操作,一个新CStudent对象就加到m_dataList表中。

  • 第二步 同上步,用MFC ClassWizard为按钮IDC_NEXT添加BN_CLICKED的消息映射,并增加下列代码:
void CEx_DocViewView:: OnBnClickedNext () 
{
	CEx_DocViewDoc *pDoc =GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->curPos!=NULL)   
	{
      	CStudent *pStudent=(CStudent *)pDoc->m_dataList.GetAt(pDoc->curPos);	
		m_nCode=pStudent->m_nCode;
		m_sName=pStudent->m_sName;
		m_lAge=pStudent->m_lAge;
		m_lScore=pStudent->m_lScore;	
		UpdateData(false); 
		pDoc->m_dataList.GetNext(pDoc->curPos);
	       if(pDoc->curPos==NULL)	
        pDoc->curPos=pDoc->m_dataList.GetHeadPosition();
	}
	else
		MessageBox("当前列表中没有数据!");
}

说明:CEx_DocViewView::OnNext函数用来循环遍历m_dataList表,首先得到文档指针,然后判断,如果curPos为空,就说明没有数据,因为在OnAdd函数中将其设在表头。如果表不空,就进行循环遍历。

上一篇:MFC界面编程基础(17):文档序列化下一篇:MFC界面编程基础(19):文档视图结构应用程序例子(Editor)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值