上一篇: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) |
---|