单文档界面与多文档界面
- 单文档程序指程序只可以打开一个文档,如:记事本
- 多文档程序指可以同时打开多个文档,如:word
创建单文档应用程序
创建单文档应用程序需要使用应用程序向导功能。使用该功能,可以方便地创建应用程序的框架。程序员可以在此基础上添加实现预定功能的代码,从而创建实现预定功能的应用程序。
- 选择project、MFC AppWizard(exe)、single document、下一步默认。
- 最后一步,选择基类,改变CTestView的基类为CEditView,就可以变为记事本一样的程序。
- 单文档程序的核心:消息传递
文档/视图结构分析
文档、视图框架通过联系几个不同的类实现整个应用程序,他们分别是应用程序类CWinApp\框架窗口类CFrameWnd、视图类CView、文档类CDocument类和CDocTemplate类。
- 主程序类CWinApp:负责进程的启动、终止、消息循环和资源管理。在整个应用程序中利用CWinApp的成员函数InitInstance进入MFC程序,同时其成员函数还包括消息循环、加载图标等。由于整个框架已经建立,一般对CWinApp不需要改变。
- 文档类的基类CDocument:提供基本操作:设置文档标题、建立新文档、打开新文档等。在CDocument类中最重要的两个函数时SetModifiedFlag和UpdateAllViews。前者设置一个标志位,一般在文档修改时调用该函数,当文档关闭时提醒用户保存修改的内容。后者是刷新所有和文档关联的视图,以保证显示的是最新内容。
- 文档类CView:最常用的是OnDraw,该函数在屏幕发生变化或因为焦点的变化需要重绘时调用。没有该函数,就不能保证程序切换后保证屏幕的正确显示,若想在数据更新时强制视图更新,可调用Invalidate和UpdateWindow来实现。
- 文档模板类CDocTemplate:将独立的文档、视图和框架窗口对象联系在一起。
- 框架窗口类CFrameWnd:负责框架窗口的维护工作,例如工具栏、菜单、状态栏的显示和更新。
单文档程序实战
- 新建单文档test,最后一步改变CTestView类基类为CFormView类。
- 添加控件
- 为控件添加数据成员
- 为按钮添加响应函数
- 类向导,添加CStudent,选择CEdit派生,这样可以使类串行化操作。在类中添加变量信息:
// Attributes
public:
CString add; //家庭住址
int age; //年龄
CString name; //姓名
int num; //学号
CString sex; //性别
CString tel; //电话号码
// Operations
- 在Student.cpp中编写函数Serialize:
void CStudent::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<<add<<age<<name<<num<<sex<<tel; //输入文件中
}
else
{ // loading code
ar>>add>>age>>name>>num>>sex>>tel; //从文件中读取
}
}
- 在Student类中声明Serialize
// Overrides
// ClassWizard generated virtual function overrides
//{
{AFX_VIRTUAL(CStudent)
public:
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
- 在类CTestDoc.h中添加数据成员:
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "student.h" //+++++++++++++++++++添加头文件
#def