三、MFC框架结构简介

1.   利用应用程序向导创建MFC框架程序:

       a. AppWizard是一个生成基础源代码的向导工具;

       b. 可以利用AppWizard生成一个具有MFC基本框架的源代码;

       c. 之后先以创建一个单文档且工程名为Test的MFC应用程序为例;


2.   MFC四大基础类简介:

       a. 利用MFC AppWizard创建Test工程之后将自动生成5个类:CAboutDlg(“关于”对话框类)、CMainFrame(基础框架类)、CTestApp(应用程序类)、CTestDoc(文档类)、CTestView(视图类);

       b. 这里先不对CAboutDlg类作介绍;

       c. 编译构建MFC应用程序的大致过程:

            i.   基于App类构建MainFrame基础框架窗口;

            ii.  在MainFrame窗口基础上构建Doc文档模板;

            iii. 基于文档模板创建与之联系的种种视图;

            注意:文档相当于数据库中的表,而视图则就是数据库概念中的视图(观察数据的窗口);


3.   CMainFrame类:

       a. AssertValid:诊断CMainFrame对象是否有效;

       b. Dump:输出CMainFrame对象的状态信息,一般用于调试;

       c. OnCreate:用于创建工具栏和状态栏,是一个消息响应函数,响应WM_CREATE消息(即传来创建工具栏和状态栏的消息时就调用该函数);

       d. PreCreateWindow:用于创建具有一定风格的窗口,是一个虚函数,如果想创建一个自定义风格的窗口则可以在派生类中覆盖该函数;


4.   CTestDoc类(文档类):

       a. 主要功能:

            i.   负责数据的维护和管理;

            ii.  实现数据的串行化,即在存储介质上的读和写;

            iii. 相应来自菜单栏、工具栏的消息WM_COMMAND;

       b. CArchieve类:

            i.   是一种二进制数据流,用于类对象以及基本类型数据的带有缓冲区机制的读写;

            ii.  其对象就和cin和cout一样具有缓冲区读写的功能,只不过是数据对于存储介质(硬盘)的读写而已;

            iii. 当然在进行读写前CArchive类对象必须和某个文件相关联(即存储介质上的区域),就类似于fopen函数用于和某个文件相关联;

            iv.  一个简单的测试:

                  *1. 创建一个控制台应用程序,其中在step 1 of 1中选择"一个支持MFC的应用程序";

                  *2. 在自己的.cpp(包含main函数的文件)的文件中添加两个函数:

void WriteToFile()
{
	CFile file;
	file.Open("M:\\Test Programs\\VC6.0\\test.txt", CFile::modeCreate | CFile::modeWrite);
	//指定打开模式为创建和写入模式,其中创建模式是指如果该文件不存在则创建它

	//也可以直接利用CFile类的带参构造函数
	//CFile file("M:\\Test Programs\\VC6.0\\test.txt", CFile::modeCreate | CFile::modeWrite)

	CArchive ar(&file, CArchive::store);
	//创建数据流对象,并且和指定的文件相关联的模式为向存储介质中存储,即写入

	int i = 9;
	char ch = 'h';
	double f = 9.6662;
	CString str("这真好玩儿");

	//利用插入运算符向流对象中插入数据
	ar << i << ch << f << str;
}

void ReadFromFile()
{
	CFile file;
	file.Open("M:\\Test Programs\\VC6.0\\test.txt", CFile::modeRead);//指定打开方式为读取
	CArchive ar(&file, CArchive::load);//指定数据流的模式是提取数据
	int i;
	char ch;
	double f;
	CString str;
	
	//从流中提取数据并打印到控制台中
	ar >> i >> ch >> f >> str;
	cout << i	<<	endl
		 << ch	<<	endl
		 << f	<<	endl
		 << str <<	endl;
}

                      然后在main函数中调用这两个函数并检查.txt中的内容即可;

       c. 串行化函数——Serialize:

           i.   用于实现对象数据在存储介质上的读取操作;

           ii.  其示范代码如下:

void CTestDoc::Serialize(CArchive& ar)//在保存或者打开时就会自动创建一个CArchive流对象作为参数实现串行化
{
	if (ar.IsStoring())//其成员函数,判断是否是保存操作,true为保存,false为读取
	{
		// TODO: add storing code here
		int i = 9;
		char ch = 'h';
		double f = 8.2345;
		CString str("这真好玩儿");
		ar << i << ch << f << str;
	}
	else
	{
		// TODO: add loading code here
		int i;
		char ch;
		double f;
		CString str;
		ar >> i >> ch >> f >> str;
		CString show;
		show.Format("%d\n%c\n%f\n%s\n", i, ch, f, str);
		//CString的成员函数,用于格式化读取一个字符串

		//由于MFC不是控制台程序因此不能使用cout、printf等,因此可以消息盒子来显示读取的信息
		//当然这只是一种显示信息的手段而已,还有很多很丰富的方法可以来显示信息
		AfxMessageBox(show);
	}
}

           iii. 调试程序:

                 *1. 调试对象就是保存和打开按钮(可以在工具栏和菜单栏中找到);

                 *2. 之所以没有在代码中看到CFile类对象和CArchive类对象关联就是因为CFile类对象已经被封装了;

                 *3. 就在打开和保存过程中填写文件路径时就会根据这个文件路径来创建CFile类对象,并创建CArchive类对象与之关联并作为参数传入Serialize函数中;

                 *4. 由于程序简单很多过程都没有实现,因此在保存后需要关闭程序,再次打开程序后使用打开按钮才会显示写入文件中的信息!                

你可能感兴趣的:(三、MFC框架结构简介)